【发布时间】:2013-07-30 22:47:14
【问题描述】:
我有一个简单的 C++ 类,我需要知道一个对象是否应该在我的程序中的某个点被删除。该机制应该可以跨平台和现代 C++ 编译器移植。
我能想到的一种方法是:有一个成员字段,它不是由构造函数初始化,而是由重载的运算符 new 分配,如下所示:
class message
{
protected:
int id;
bool dynamic;
public:
message(int _id): id(_id)
{
// don't touch `dynamic` in the constructor
}
void* operator new(size_t size)
{
message* m = (message*)::operator new(size);
m->dynamic = true;
return m;
}
void operator delete(void* m)
{
if (((message*)m)->dynamic)
::operator delete(m);
}
};
除了它“感觉”不对的形式,这种方法有什么问题?
编辑: 应该提到该对象是动态的或静态的(并且永远不会是堆栈本地的),因此可以保证将其归零或使用 new 进行初始化。
【问题讨论】:
-
为什么你需要这个?我可以保证这是错误的方法,即使有一种方法可以按照您的要求进行(我很确定没有)。您不必在运行时决定是否使用
delete指针,因为您应该知道(编辑:在设计时,即就程序而言,先验)谁拥有什么以及它的生命周期是什么. -
制作析构函数
private。那么答案总是“是”。 -
@delnan:不,你不能保证 :) 这是一个优化问题。我有一个消息队列,有很多消息经过;在某些情况下它们是动态分配的,但在另一些情况下,只是为了优化,我可以重用静态对象(当然要确保静态对象只进入消息队列一次)。
-
@mojuba:所以你的问题应该是“我有一个消息队列,想像这样优化它,我该如何......”。请参阅XY problem。
-
@GManNickG:不,我的问题是:我有可能是静态或动态的对象,我希望这些对象只在一个地方被销毁。
标签: c++ operator-overloading new-operator