确定在C ++中是否动态分配对象

时间:2013-07-30 22:47:15

标签: c++ operator-overloading new-operator

我有一个简单的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进行归零或初始化。

2 个答案:

答案 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_ptrshared_ptr与自定义删除器一起使用,如果对象是堆栈分配的,您可以在其分配站点上知道;在这种情况下,您可以提供一个no-op删除器,如下所示:

struct null_deleter {
  template<class T>
  void operator()(const T*) const {}
};