在我执行 push_back 到 std::list 后,我的对象似乎发生了变化。
这是 push_back 之前的对象:
看看在一些有效的 m_parent_reference 指针之后它最终变成 nullptr 从而结束链。
这就是我的对象在 push_back() 之后的样子
现在没有 nullptr 了。相反,一个 parent_reference 引用它的 child ,创建一个永无止境的循环。
-
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) {};
使用自定义复制构造函数和赋值运算符,我可以观察到以下内容:
- Assign Operators 永远不会被调用
- 对 `CKerEDIReference::CKerEDIReference(const CKeerEDIReference&) 的引用已经被破坏,因为它已经有了这个永无止境的循环。
编辑 更多信息:
- 调用
{CKerEDIInterchange tmp(nInterchange);}
做 不会导致对象损坏。 - 不涉及切片。 m_InterchangeList 属于
type std::list<CKerEDIInterchange>
和 nInterchange 如果类型CKerEDIInterchange
我真的很想知道是否有人可以给我提示下一步该看哪里。
提前致谢, 尼克帕帕乔吉奥
最佳答案
我找到了这种行为的原因。
显然其中一个 CKerEDIReference
对象已经被删除。通过将新对象添加到列表中,新列表项被写入该已删除对象的内存中。我猜它没有崩溃纯属巧合。
关于c++ - 为什么我的对象在 list::push_back() 之后会发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15880585/