这种"同时"和"删除"的好奇组合是什么意思?

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)

我是否监督过任何事情,或者这是一条未定义行为的平坦之路?

我在这里看到的是,如果objectCCuriousClass::~CCuriousClass()被调用点是一个空指针,一切都会好的 - 不采取任何行动 - 但如果object不是null,这将是一个内部未定义行为的无限循环.

这很可能是一个我不明白的错误或智能构造吗?

And*_*nck 13

这看起来像一个bug.


Mik*_*our 9

可能是某些疯子已经实施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工作方式的误解造成的错误.

  • 那个好漂亮!:从现在开始,我将编写所有这些析构函数. (4认同)

Seb*_*ian 6

既然你的问题似乎意味着"有人会对此有什么意义?" 而不是"为什么这是一个奇妙的想法?" 我建议如下:

class CSomeType {
    CCuriousClass* m_plistentry;
    CSomeType* m_pnext;

    ~CSomeType() {
        m_plistentry->object = m_pnext;
    }
};
Run Code Online (Sandbox Code Playgroud)

基本想法可能是所有者指向列表的头部,并且列表只能在头部删除.如果头被删除,它会将其父指针设置为列表的新头.如果父进程被破坏,则会破坏每个列表元素.

现在这显然是来自疯狂城镇的代码.