13

重複の可能性:
「delete this」を使用して現在のオブジェクトを削除してもよろしいですか?

クラス関数で実行されたコードを見たところです。delete this;これは良い設計ではないことはわかっていますが、何が起こるかを定義しています。クラスは常にどこかからのポインターであるとしましょう。常に正しい方法で削除されますか?

class A
{
 public:
    void abort() { delete this; }
};

class B
{
    void func() { A* a = new A; a->abort(); }
};
4

6 に答える 6

17

これは C++ では完全に合法でdelete thisあり、実際にはスマート ポインターなどの特定のパターンに非常に役立ちます。ただし、開発者には、他のメソッドが呼び出されないようにするため、またはthis削除後にインスタンス データにアクセスするスタック上で負担がかかります。

C++ FAQ Lite には、これに関するエントリがあり、読む価値があります。

于 2010-11-29T16:27:35.273 に答える
2

設計が悪いわけでdelete this;はなく、未定義の動作が発生することはありません。このオブジェクトを削除します。delete thisつまり、が呼び出された後は、オブジェクトに対して他に何もしないことを本当に確認する必要があります。

Microsoft MFC クラスdelete this;は、CWnd (ウィンドウ) クラスなどで広く使用されています。ウィンドウが WM_DESTROY メッセージを受け取ると、ウィンドウ ラッパー クラス (これは C++ オブジェクトです) は不要になるため、呼び出しますdelete this;(私はPostNcDestroy()そのような場所で考えます)。フレームワークのユーザーの観点からは非常に便利です。C++ オブジェクトが自動的に削除される方法があることを覚えておく必要があり、ウィンドウの有効期間の終わり近くに少し注意する必要があります。

delete this;が有用なパラダイムである実世界の例は他にもたくさんあると思います。

于 2010-11-29T16:32:55.873 に答える
1

はい。deleteポインタthisdelete. _

于 2010-11-29T16:28:41.810 に答える
1

はい、通常どおり削除する必要があります。

これが役立つ場合がいくつかありますが、その後オブジェクトがアクセスされないようにするために特別な注意が必要です。

于 2010-11-29T16:29:14.257 に答える
0

コメンターによって指摘されたように、削除後に他のメンバーが呼び出されない場合、未定義の動作はありません。オブジェクトの他のメンバーにアクセスしない場合は、関数を続行できます。

于 2010-11-29T16:26:56.070 に答える
0

aこの特定のケースでは問題ありませんが、が自動変数の場合はどうなるか考えてみてください。

void foo() {
    A a;
    a.abort(); // BOOM!
}
于 2010-11-29T16:31:07.253 に答える