I was just reading this article and wanted SO folks advice:
Q: Should delete this;
be called from within a member method?
I was just reading this article and wanted SO folks advice:
Q: Should delete this;
be called from within a member method?
はい、できます。ここに、いつ、どのような理由があるかについての適切な説明があります。
反対票の準備をしています。
すべきか:いいえ。
技術的には可能ですか:はい
それは良い考えですか:絶対にありません。
便利な状況はありますか:もちろんです。あなたがC++の場合、fooは非常に強力です。しかし、ほとんどの人はそれほど良くありません。したがって、これを行うのは、適切なコードレビューを行うことができるチームが一緒に働いている場合のみにしてください。
理由:
オブジェクトが動的に割り当てられている(したがって削除する必要がある)か、通常のオブジェクトである(したがって削除してはならない)ことをオブジェクトが知る方法がないため、削除する必要がある天気をどのように決定できますか。したがって、オブジェクトがそれ自体を削除している場合、私の意見では、デザインにひどく間違っていることがあります。
管理が必要なオブジェクトがある場合は、管理を行うための個別のオブジェクトを作成する必要があります(したがって、スマートポインター)。オブジェクトに得意なことをさせてから、オブジェクトの管理を別のオブジェクトに分離します。
はい、一般的な場合がいくつかあります。
参照カウント:
void release()
{
cnt--;
if (cnt == 0)
delete this;
}
GUI プログラミング。一部のフレームワークでは、ユーザーがウィンドウを閉じると、ウィンドウ自体が削除されるのが一般的です。
これは、MFCの時代によく使用されていました。IIRCは、ウィンドウが受信する最後のメッセージです。もちろん、あなたが何らかの形のサディストであると仮定すると、WM_NCDESTROY
その時点で呼び出すことができます(ただし、MFC自体がこれを行うこともあります)。delete this
一部のスレッド ライブラリは、スレッド終了時に自動破棄を実装するときにこれを使用します。
void Thread::threadFunc()
{
doRun();
if(this->destroyOnExit == true)
delete this;
}
delete this
非メンバー関数から呼び出すことはできません:)メンバー関数の最後の要素があれば、それを行うことができます。戻った後、そのオブジェクトが存在したことを忘れます....しかし、ええ、その記事が尋ねるように...なぜあなたはこれをしたいのですか? 標準が何を言っているのかわかりませんが、それは私に面白い気持ちを与えます:P
これは、GOTO ステートメントを使用する必要がある場合と少し似ていると思います。私は個人的に GOTO を使用して、特に例外的な条件下で C のリソースをクリーンアップすることがあります。
共有された状態の意味が何であるか疑問に思います (私が知っているあいまいなステートメント):P
はい。delete this
すべての回答が言うように、が呼び出された後にクラスのデータが使用されないことが 100% 確実な場合。
たとえば、あるプロジェクトでは次のようになります。
void Test()
MyClass * Someclass = new MyClass;
SomeClass->DoYourThing();
SomeClass->KillYourself();
return;
void MyClass::DoYourThing() { return; }
void MyClass::KillYourself() {delete this;}
非常に単純化した説明です。プロジェクトdelete this;
は、そのタイプのオブジェクトのメモリ管理の一部として使用されます。それらのコンストラクターは、それらを使用中のそのタイプのクラスのプライベートリストに追加し、それらが破棄されたときにそのリストから自分自身を削除し、その後自分自身を削除しました(これはデストラクタにはありませんでした)。プログラムがエンドポイントに到達したときに自分自身を削除していなかったそのクラスのオブジェクトはすべてKillYourself()
、静的メンバー関数から同等のものを呼び出しましたCleanYourselves()