我想显式地销毁一个对象(调用它上面的析构函数及其所有字段),但是我可能会发现仍然有一些指向该对象的指针.因此,我不想释放记忆; 相反,我想留下一种标志"我是一个被摧毁的对象".
我想到了以下方法:
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;
}
};
Run Code Online (Sandbox Code Playgroud)
当destroy被召唤时,我基本上会破坏我拥有的任何物体(可能是衍生物)并在同一个地方创建一个新的"僵尸".因此,我希望实现:
ptr先前指向此对象的任何其他指针仍可调用ptr->isDestroyed()以验证其存在.BaseClass)delete仍然正确吗?问题:
使用上述模式时是否还有其他问题需要考虑?
调用delete僵尸对象会正确释放前一个(普通)对象消耗的整个内存吗?
虽然我很感激您对如何以不同方式进行操作的意见,我可能倾向于按照您的方式进行操作 - 我仍然希望了解上述代码带来的所有风险.
你对你的问题有一些讨厌的评论.现在我不认为他们是应得的,尽管可能有更好的方法来做你想要的.我知道你来自哪里,但实际上你使用的是析构函数,就像使用你拒绝写的重置函数一样.实际上你从调用析构函数中得不到什么,因为调用析构函数与实际删除或重置任何东西无关,除非你实际编写代码在析构函数中执行它.
至于您关于新展示位置的问题:
您可能已经知道,placement new不会分配任何内存,因此调用它只会在同一个地方创建对象.我明白这正是你想要的,但这不是必要的.由于你没有在对象上调用delete只是destroy,你可以在不初始化类的情况下将destroy设置为true.
把它们加起来:
要执行您想要正确执行的操作并获得析构函数的好处,您应该重载类的new和delete操作符并使用正常的销毁机制.然后,您可以选择不释放内存,但将其标记为无效或可能释放大部分内存,但将指针指向某些标记.
编辑
在评论之后,我决定总结我看到的所有风险以及其他人指出的风险:
我重复我的建议 - 重载删除和新的你想要的