2

在我将 push_back 放入 std::list 之后,我的对象似乎发生了变化。

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

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

这就是我的对象在 push_back() 之后的样子 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. 变量 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

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

在此先感谢,尼克帕帕乔吉奥

4

1 回答 1

0

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

于 2013-04-09T19:00:05.547 回答