プログラムの特定の時点でオブジェクトを削除する必要があるかどうかを知る必要がある単純な 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
。