delete this
デストラクタでは無効です。他の場所で使用できます。しかし、それが良い考えであることはめったにありません。wxWidgets
フレームワークはそれをスレッド クラスに使用します。スレッドが実行を終了すると、システム リソースとそれ自体 (wxThread オブジェクト) を自動的に解放するモードがあります。オブジェクトが存在しないため、外部から参照することが有効かどうかを知ることができないため、非常に面倒IsValid
でした。オブジェクトが存在しないため、関数を呼び出すことはできません。delete this
非動的オブジェクトには使用できないという問題を除けば、これが の主な問題のようです。
それを行う場合は、データメンバーに触れたり、削除したオブジェクトでメンバー関数を呼び出したりしないようにしてください。非仮想、保護、またはプライベート関数の最後のステートメントとして実行することをお勧めします。delete の呼び出しは、仮想および/またはパブリック関数でも有効ですが、それを行うメソッドの可視性を制限します。
C++ FAQには、それに関するエントリがあります。上記の私の主張に関する C++ 標準の引用 ( 3.8p5
):
オブジェクトの有効期間が開始する前であるが、オブジェクトが占有するストレージが割り当てられた後、またはオブジェクトの有効期間が終了した後、オブジェクトが占有していたストレージが再利用または解放される前に、ストレージを参照するポインターオブジェクトが配置される、または配置された場所を使用できますが、限られた方法でのみ使用できます。[...]オブジェクトが非自明なデストラクタを持つクラス型になるか、そうであった場合、ポインタが削除式のオペランドとして使用されると、プログラムは未定義の動作をします。
オブジェクトのデストラクタが実行を開始すると、ライフタイムは終了します。このパラグラフの後に続く、構築中および破棄中のオブジェクトに関する規則には例外があることに注意してください (たとえば、非静的データ メンバーへのアクセスが許可されます)。詳しくは、 を参照して12.7
ください。