为什么我的对象在list :: push_back()之后发生了变化

时间:2013-04-08 13:37:35

标签: 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引用它的子节点,创建一个无休止的循环。

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

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

    1. 永远不会调用赋值运算符
    2. 对CKerEDIReference :: CKerEDIReference(const CKerEDIReference&amp;)的引用已经破坏,因为它已经有了这个无休止的循环。
    3. 修改 更多信息:

      1. 致电{CKerEDIInterchange tmp(nInterchange);} 不会导致物体损坏。
      2. 不涉及切片。 m_InterchangeList是type std::list<CKerEDIInterchange>,nInterchange是类型 CKerEDIInterchange
      3. 我真的很想知道是否有人可以给我一个提示在哪里看下一步。

        提前致谢, Nick Papagiorgio

1 个答案:

答案 0 :(得分:0)

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