クラス関数で実行されたコードを見たところです。delete this;
これは良い設計ではないことはわかっていますが、何が起こるかを定義しています。クラスは常にどこかからのポインターであるとしましょう。常に正しい方法で削除されますか?
class A
{
public:
void abort() { delete this; }
};
class B
{
void func() { A* a = new A; a->abort(); }
};
クラス関数で実行されたコードを見たところです。delete this;
これは良い設計ではないことはわかっていますが、何が起こるかを定義しています。クラスは常にどこかからのポインターであるとしましょう。常に正しい方法で削除されますか?
class A
{
public:
void abort() { delete this; }
};
class B
{
void func() { A* a = new A; a->abort(); }
};
これは C++ では完全に合法でdelete this
あり、実際にはスマート ポインターなどの特定のパターンに非常に役立ちます。ただし、開発者には、他のメソッドが呼び出されないようにするため、またはthis
削除後にインスタンス データにアクセスするスタック上で負担がかかります。
C++ FAQ Lite には、これに関するエントリがあり、読む価値があります。
設計が悪いわけでdelete this;
はなく、未定義の動作が発生することはありません。このオブジェクトを削除します。delete this
つまり、が呼び出された後は、オブジェクトに対して他に何もしないことを本当に確認する必要があります。
Microsoft MFC クラスdelete this;
は、CWnd (ウィンドウ) クラスなどで広く使用されています。ウィンドウが WM_DESTROY メッセージを受け取ると、ウィンドウ ラッパー クラス (これは C++ オブジェクトです) は不要になるため、呼び出しますdelete this;
(私はPostNcDestroy()
そのような場所で考えます)。フレームワークのユーザーの観点からは非常に便利です。C++ オブジェクトが自動的に削除される方法があることを覚えておく必要があり、ウィンドウの有効期間の終わり近くに少し注意する必要があります。
delete this;
が有用なパラダイムである実世界の例は他にもたくさんあると思います。
はい。delete
ポインタthis
はdelete
. _
はい、通常どおり削除する必要があります。
これが役立つ場合がいくつかありますが、その後オブジェクトがアクセスされないようにするために特別な注意が必要です。
コメンターによって指摘されたように、削除後に他のメンバーが呼び出されない場合、未定義の動作はありません。オブジェクトの他のメンバーにアクセスしない場合は、関数を続行できます。
a
この特定のケースでは問題ありませんが、が自動変数の場合はどうなるか考えてみてください。
void foo() {
A a;
a.abort(); // BOOM!
}