2016-10-24 7 views
2

これは本当に正当なものではない、またはメンバーオブジェクトが別のインスタンスで置き換えられている未定義の動作を含むと感じています。私はここStackOverflowとGoogleでかなり長い間検索し、主にdelete this;に行きたいと思っていた人々を見つけました。もし私がnew私のインスタンスと私はdeleteそれをしなかったので、delete this;質問が同じ状況のものであるかどうかは完全にはわかりません。オブジェクトは自分自身を置き換えることは法的ですか?

私は正しいですか?

このようなことをするためのコードがまだ必要な場合は、簡単な方法がありますか?

struct Test; 

struct Member { 
    void fail(); 
    Test* test; 
}; 

struct Test { 
    Test(): member() { 
     member.test = this; 
    } 

    void doStuff() { 
     member.fail(); 
    } 

    Member member; 
}; 

void Member::fail() { 
    test->member = Member(); // delete the object the current code is executing on 
} 

int main() { 
    Test bla; 
    bla.doStuff(); 
} 
+1

投稿したコードに違法はありません。 – NathanOliver

+2

@krzaq私はインスタンスを 'new'しなかったので、同じ状況であるかどうかは完全にはわかりません。インスタンスを削除しないでください。 – risingDarkness

+1

@k rzaq:_ "どちらの場合も、そのオブジェクトのメンバ関数の途中で終了します。" _あなたはどちらの場合も誤ってピックします "。オブジェクトに割り当てることは、オブジェクトの存続期間にまったく影響しません。 –

答えて

4
// delete the object the current code is executing on 

いや、それは何も削除されません。

一時的なMemberオブジェクトを作成し、その一時的なものを引数として*thisのコピー代入演算子を呼び出すだけです。

C++の観点からは、これはオブジェクトの「置き換え」でもなく、オブジェクトの「削除」もありません。それは単なるメンバー関数呼び出しです。この場合、唯一の観察可能な結果は、fail()の呼び出し後にtestがゼロになることです。

オブジェクトに割り当てることは、その有効期間に影響しません。

ここで、deletenewで再生を開始した場合、問題が発生します。

+0

元の 'member'の生存期間は' fail() 'の後に終わりますか? – risingDarkness

+1

@risingDarkness:それは私が今言ったすべてのものの反対です。 –

+0

ああ!さて、私は今それを得ると思います。コピー代入演算子は内容を一時的な内容に割り当てるだけなので、元の 'メンバー 'は決して破壊されません。一時的なものは割り当て後に破棄されますが、それはまったく問題ではありません。私は今それを得ましたか? – risingDarkness

0

私が知っている限り、これは法的には合法ですが、それを行うための簡単な方法があります。上記のコードに問題があった場合は、failメソッドが "test"ポインターの値を0にリセットし、それがヌルポインターになるためです。以下のコードは、これらの問題を起こさずにリセットを実行します。

struct Member 
{ 
    int value = 0; 
    void step() 
    { 
     value++; 
     std::cout << "Member::step()" << std::endl; 
    } 
    void fail() 
    { 
     *this = Member(); 
     std::cout << "Member::fail()" <<std::endl; 
    } 
    void print() 
    { 
     std::cout << "X::print(): " << value << std::endl; 
    } 
}; 
int main() 
{ 
    Member x; 
    x.print(); 
    x.step(); 
    x.print(); 
    x.fail(); 
    x.print(); 
} 
関連する問題