0

プログラムの特定の時点でオブジェクトを削除する必要があるかどうかを知る必要がある単純な C++ クラスがあります。このメカニズムは、プラットフォーム間および最新の C++ コンパイラ間で移植可能でなければなりません。

私が考えることができるそれを行う1つの方法は、次のように、コンストラクターによって初期化されず、代わりにオーバーロードされた演算子 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

4

2 に答える 2

3

コンストラクターはdynamicfalse に設定する必要があり、オーバーライドする代わりにnew、次のような静的メソッドが必要です。

static message *createMessage(int _id)
{
    message *ret = new message(_id);
    ret->dynamic = true;
    return ret;
}

そして、 をnewing する代わりにそのメソッドを呼び出しますmessage

于 2013-07-30T22:50:12.217 に答える
3

これをしないでください。機能しないという事実は別として、オブジェクトはそれ自体の寿命について何も管理すべきではありません。unique_ptrorをカスタムのデリータと共に使用できますshared_ptr。オブジェクトがスタック割り当てされている場合は、その割り当てサイトでわかります。その場合、次のようなノーオペレーションのデリータを指定できます。

struct null_deleter {
  template<class T>
  void operator()(const T*) const {}
};
于 2013-07-30T22:55:03.217 に答える