【发布时间】:2012-11-10 12:11:08
【问题描述】:
我想显式地销毁一个对象(调用它及其所有字段的析构函数),但可能会发生我仍然持有一些指向相关对象的指针。因此,我还不想释放内存;相反,我想留下一个标志“我是一个被破坏的对象”。
我想到了以下方法:
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 会正确释放前一个(正常)对象消耗的整个内存吗?
虽然我很欣赏您对如何以不同方式进行操作的意见,并且我可能倾向于按照您的方式进行操作 - 我仍然想了解上述代码带来的所有风险。
【问题讨论】:
-
您似乎在寻找
std::shared_ptr。 -
这是个坏主意。使用智能指针。
-
new(this) BaseClass();- 如果this是“最初属于派生类型”,我敢肯定,在此之后所有的赌注都没有了。 -
@CygnusX1 - 这是我很久以来见过的最愚蠢和最愚蠢的代码。你到底想达到什么目的?!
-
@CygnusX1,惊喜 - 这正是
weak_ptr的工作原理。
标签: c++