在我将 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
- 既没有
CKerEDIInterchange
也CKerEDIReference
没有自定义复制构造函数 - 我已经使用 Visual Studio 2010 SP1 和 Visual Studio 2012 Update 2 测试了这种行为
- 变量 m_parent_reference 只能通过构造函数设置
CKerEDIReference(const CKerEDIReference* const parent_reference = NULL) : m_parent_reference(parent_reference) {};
使用自定义复制构造函数和分配运算符,我可以观察到以下内容:
- 永远不会调用分配运算符
- 对 `CKerEDIReference::CKerEDIReference(const CKerEDIReference&) 的引用已经被破坏,因为它已经有这个永无止境的循环。
编辑 更多信息:
- 调用
{CKerEDIInterchange tmp(nInterchange);}
不会导致对象损坏。 - 不涉及切片。m_InterchangeList 是
type std::list<CKerEDIInterchange>
和 nInterchange 如果是类型CKerEDIInterchange
我真的很想知道是否有人可以给我提示下一步该往哪里看。
在此先感谢,尼克帕帕乔吉奥