c++ - 为什么我的对象在 list::push_back() 之后会发生变化

标签 c++ stl

在我执行 push_back 到 std::list 后,我​​的对象似乎发生了变化。

这是 push_back 之前的对象: object before push_back

看看在一些有效的 m_parent_reference 指针之后它最终变成 nullptr 从而结束链。

这就是我的对象在 push_back() 之后的样子 object after push_back

现在没有 nullptr 了。相反,一个 parent_reference 引用它的 child ,创建一个永无止境的循环。

  1. m_InterchangeList类型为 std::list<CKerEDIInterchange>
  2. m_parent_reference类型为 CKerEDIReference
  3. CKerEDIInterchange继承自 CKerEDIReference
  4. 都不是CKerEDIInterchange也不CKerEDIReference有一个自定义的复制构造函数
  5. 我已使用 Visual Studio 2010 SP1 和 Visual Studio 2012 Update 2 测试了此行为
  6. 变量m_parent_reference只能通过构造函数设置
           CKerEDIReference(const CKerEDIReference* const parent_reference = NULL)
            : m_parent_reference(parent_reference) {};
    

使用自定义复制构造函数和赋值运算符,我可以观察到以下内容:

  1. Assign Operators 永远不会被调用
  2. 对 `CKerEDIReference::CKerEDIReference(const CKeerEDIReference&) 的引用已经被破坏,因为它已经有了这个永无止境的循环。

编辑 更多信息:

  1. 调用 {CKerEDIInterchange tmp(nInterchange);}做 不会导致对象损坏。
  2. 不涉及切片。 m_InterchangeList 属于 type std::list<CKerEDIInterchange>和 nInterchange 如果类型 CKerEDIInterchange

我真的很想知道是否有人可以给我提示下一步该看哪里。

提前致谢, 尼克帕帕乔吉奥

最佳答案

我找到了这种行为的原因。 显然其中一个 CKerEDIReference 对象已经被删除。通过将新对象添加到列表中,新列表项被写入该已删除对象的内存中。我猜它没有崩溃纯属巧合。

关于c++ - 为什么我的对象在 list::push_back() 之后会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880585/

相关文章:

c++ - x64 汇编、ret 寄存器和变量

c++ - 制作一个 Mat 类型对象的数组。输出窗口显示相同的帧

c++ - boost::msm - 一种获取状态的字符串表示形式(即 getName)的方法?

c++ - 中断任意等待操作

c++ - g++ 编译器错误 : expected ‘,’ or ‘...’ before ‘>’ token only on Mac

c++ - 插入到 multimap 导致段错误

c++ - 为什么未指定 std::reverse_iterator::operator[] 的返回类型?

c++ - 禁用 USB 内存棒的存储功能并自动启动程序

c++ - 在这种情况下,为什么 STL priority_queue 并不比 multiset 快多少?

c++ - std::map 属性 - C+ 标准要求?