9

デストラクタ内にいるとき、他のスレッドがオブジェクトのメンバー関数の実行を開始する可能性はありますか? この状況にどう対処するか?

4

3 に答える 3

17

C++ には、オブジェクトが削除された後にオブジェクトを使用することに対する本質的な保護はありません。競合状態については忘れてください。完全に削除された後、別のスレッドがオブジェクトを使用する可能性があります。

また:

  1. コード内の 1 つの場所だけがオブジェクトを所有していることを確認し、誰もオブジェクトを使用していないときに削除する責任があります。
  2. オブジェクト参照をカウントする - 明示的な参照カウント コードを追加するか、参照カウントを実装する適切な基本クラスを見つけることによって
于 2009-01-20T16:29:55.767 に答える
15

他に何も使用しようとしないことが確実でない限り、オブジェクトを破棄するべきではありません。理想的には、他に何も参照していません。delete を呼び出すときは、より詳しく調べる必要があります。

于 2009-01-20T16:17:55.433 に答える
2

例外ハンドラーでのスタックの巻き戻しが原因でデストラクタにいる場合は、シリアル化されたブロック内で例外をトラップするようにコードを再配置することをお勧めします。

ブロックの後、オブジェクトがまだ有効かどうかを確認し、メソッドを呼び出します。そうすれば、1 つのスレッドでの例外により、他のスレッドがデストラクタへの呼び出しを適切に処理できるようになります。

于 2009-01-20T16:36:55.877 に答える