2013-04-08 31 views
2

看起来我的对象在执行push_back到std :: list后发生了变化。为什么我的对象在list :: push_back()之后改变

这是之前的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有一个自定义拷贝构造函数CKerEDIReference
  4. CKerEDIInterchange继承
  5. 我已经测试与Visual Studio 2010这一行为SP1和Visual Studio 2012更新2
  6. 变量m_parent_reference只能通过构造
      CKerEDIReference(const CKerEDIReference* const parent_reference = NULL) 
         : m_parent_reference(parent_reference) {}; 
    

设置通过自定义的拷贝构造函数和赋值操作符,我可以注意以下几点:

  1. 指定运营商从来不被称为
  2. 参考给` CKerEDIReference :: CKerEDIReference(const CKerEDIReference &)已经被破坏了,因为它已经有了这个永无止境的循环。

编辑 更多的相关信息:

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

的我真的很想知道,如果任何人都可以给我一个提示去哪里找下一个。

由于提前, 尼克Papagiorgio

+3

你不应该发布代码,而不是*帮助重现问题。你应该发布一些确实显示问题的代码。我们应该如何找出其他问题呢? – 2013-04-08 13:41:27

+0

您的父引用是否有任何机会指向'm_InterchangeList'中的项目?因为当列表内部调整大小时,指针变得无效。 – riv 2013-04-08 13:43:50

+1

没有拷贝构造函数,但是你的类是否具有析构函数? – john 2013-04-08 13:44:13

回答

0

我发现FO这种现象的原因。 显然这些CKerEDIReference对象之一已被删除。通过将新对象添加到列表中,新的listitem被写入到该删除对象的内存中。我想这只是纯粹的巧合,它并没有崩溃。

相关问题