我有一个简单的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
进行归零或初始化。
答案 0 :(得分:3)
构造函数需要将dynamic
设置为false,然后不需要覆盖new
,而是需要一个静态方法,如:
static message *createMessage(int _id)
{
message *ret = new message(_id);
ret->dynamic = true;
return ret;
}
然后调用该方法而不是new
message
。
答案 1 :(得分:3)
不要这样做。除了它不起作用的事实之外,对象不应该管理有关其自身生命的任何事情。您可以将unique_ptr
或shared_ptr
与自定义删除器一起使用,如果对象是堆栈分配的,您可以在其分配站点上知道;在这种情况下,您可以提供一个no-op删除器,如下所示:
struct null_deleter {
template<class T>
void operator()(const T*) const {}
};