2017-09-13 4 views
2

これは、中間のメソッド呼び出しで起こることと関連して、delete this議論のバリエーションです。C++が削除されたオブジェクトのメソッドに戻る

基本的に、メソッドAがメソッドBを呼び出し、メソッドBがオブジェクトを破棄すると、Bから戻るときにメソッドAの中で何か特別なことが起きますか?このような何かを:

struct test { 
    void A() { 
    B(); 
    // what happens here besides being unable to dereference `this` anymore? 
    } 
    void B() {delete this;} 
}; 

期限切れのオブジェクトのメソッドに返すことは限り元のオブジェクトのメモリ位置は任意のさらなると相互作用していないとして、通常のように進行すると仮定することはできますか?

+0

はい。 ]]]]]]]]]] –

答えて

3

それはへの罰金の対象です:

  1. オブジェクトがnewで作成されている必要があります。 (のプレースメントnewには問題ありません)。

  2. delete this;(スタックの巻き戻しによって再入力された機能は問題ありません)を呼び出した後で、メンバー関数を呼び出したりメンバデータにアクセスしたりしないでください。

  3. thisにはポインタ型を割り当てないでください。

あなたのケースでは、問題はありません(1に準拠していると仮定します)。

+3

私は適切な複製を見つけるよりも速く答えました。それは賞賛ではない、btw。 –

+0

これは 'delete this'のせいではなく、オブジェクトの待ち行列に並行して動作するガベージコレクタのせいで、私のために出てきました。キューが処理される方法は、時には再帰的なメソッド呼び出しを伴うので、オブジェクトが死んだオブジェクトとのやりとりを心配することなく、オブジェクトが削除されたときを検出することが可能です。しかし、スタックの巻き戻しの動作については疑問がありました。 –

3

何も起こりません。もちろん好きに注意を払うために明白なものがあります。

  • は、オブジェクトthisポイントにはnewで割り当てられたことを確認してください。
  • B()の後に他のメンバー関数を呼び出したり、B()の後にメンバー変数にアクセスしたりしないでください。
  • B()の後に何かのためにthisを使用しないでください。ポインタ自体さえありません。
+1

「特に」とは何を意味するのか気にしませんか? – Bathsheba

+1

@Bathsheba私には分かりません。 –

関連する問題