在将push_back转换为std::list之后,对象似乎发生了变化。

这是push_back之前的对象:

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

这是我的对象在push_back()之后的外观

现在没有nullptr了。相反,一个parent_reference引用了其子级,从而创建了一个无休止的循环。

  • m_InterchangeList类型为std::list<CKerEDIInterchange>
  • m_parent_reference类型为CKerEDIReference
  • CKerEDIInterchange继承自CKerEDIReference
  • CKerEDIInterchangeCKerEDIReference都没有自定义副本构造函数
  • 我已经使用Visual Studio 2010 SP1和Visual Studio 2012 Update 2测试了此行为
  • 只能通过构造函数CKerEDIReference(const CKerEDIReference * const parent_reference = NULL)设置变量m_parent_reference。
    :m_parent_reference(parent_reference){};

  • 使用自定义副本构造函数和分配运算符,我可以观察到以下内容:
  • 分配运算符从不称为
  • 对`CKerEDIReference::CKerEDIReference(const CKerEDIReference&)的引用已被破坏,因为它已经具有这个永无休止的循环。

  • 编辑
    更多信息:
  • 调用{CKerEDIInterchange tmp(nInterchange);}可以
    不会导致损坏的对象。
  • 不涉及 slice 。 m_InterchangeList的类型为typestd::list<CKerEDIInterchange>,如果类型为nInterchange,则为nInterchangeCKerEDIInterchange

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

    提前致谢,
    尼克·帕帕乔吉欧(Nick Papagiorgio)

    最佳答案

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

    07-28 04:44