我想显式地销毁一个对象(调用它及其所有字段的析构函数),但可能会发生我仍然持有一些指向相关对象的指针。因此,我还不想释放内存;相反,我想留下一种标志“我是一个被破坏的物体”。
我想到了以下方法:
class BaseClass { //all objects in question derive from this class
public:
BaseClass() : destroyed(false) {}
virtual ~BaseClass() {}
private:
bool destroyed;
public:
bool isDestroyed() { return destroyed; }
void destroy() {
this->~BaseClass(); //this will call the virtual destructor of a derivative class
new(this) BaseClass();
destroyed=true;
}
};
当destroy
被调用时,我基本上会破坏我拥有的任何对象(可能是派生对象)并在同一个地方创建一个新的“僵尸”对象。因此,我希望实现:
ptr
以前指向该对象的任何其他指针仍然可以调用ptr->isDestroyed()
以验证其存在。- 我知道,如果我不检查僵尸标志并尝试访问属于任何派生对象的字段,则可能会发生不好的事情
- 我知道僵尸对象仍然消耗与被破坏对象一样多的内存(因为它可能是 的派生对象
BaseClass
) - 我仍然必须释放被破坏对象的内存。但是,我希望那个调用
delete
仍然正确吗?
问题:
使用上述模式时还有其他问题需要考虑吗?
调用delete
僵尸对象会正确释放前一个(正常)对象消耗的整个内存吗?
虽然我很欣赏您对如何以不同方式进行操作的意见,并且我可能倾向于按照您的方式进行操作 - 我仍然想了解上述代码带来的所有风险。