sha*_*oth 4 c++ pointers memory-management
回顾一个相当古老的项目,我发现了以下奇怪的代码片段(仅提取相关代码):
class CCuriousClass {
~CCuriousClass();
CSomeType* object;
};
CCuriousClass::~CCuriousClass()
{
while( object != NULL ) {
delete object;
}
}
Run Code Online (Sandbox Code Playgroud)
我是否监督过任何事情,或者这是一条未定义行为的平坦之路?
我在这里看到的是,如果object在CCuriousClass::~CCuriousClass()被调用点是一个空指针,一切都会好的 - 不采取任何行动 - 但如果object不是null,这将是一个内部未定义行为的无限循环.
这很可能是一个我不明白的错误或智能构造吗?
可能是某些疯子已经实施CSomeType了对其拥有的反向引用CCuriousClass,并且它的析构函数有时会创建替代品.像这样的东西:
class CSomeType
{
public:
explicit CSomeType(CCuriousClass &parent) : parent(parent) {}
~CSomeType()
{
parent.object = respawn() ? new CSomeType(parent) : 0;
}
private:
CCuriousClass &parent;
};
Run Code Online (Sandbox Code Playgroud)
我并不是说任何人都应该编写这样的扭曲逻辑.它可能仍然提供未定义的行为,因为我相信delete允许修改指针.但它可以解释为什么有人可能会认为给定的代码可能有效.
另一方面,它可能只是由于对delete工作方式的误解造成的错误.
既然你的问题似乎意味着"有人会对此有什么意义?" 而不是"为什么这是一个奇妙的想法?" 我建议如下:
class CSomeType {
CCuriousClass* m_plistentry;
CSomeType* m_pnext;
~CSomeType() {
m_plistentry->object = m_pnext;
}
};
Run Code Online (Sandbox Code Playgroud)
基本想法可能是所有者指向列表的头部,并且列表只能在头部删除.如果头被删除,它会将其父指针设置为列表的新头.如果父进程被破坏,则会破坏每个列表元素.
现在这显然是来自疯狂城镇的代码.