2017-03-14 5 views
2

私は次のC++コードを持っています。 Linuxマシンでg ++ 4.9.2でコンパイルできます。それから私はそれを実行すると、10を出力します。新しいオブジェクトが作成され、デフォルトコンストラクタのconst_castを使って作成されたポインタに割り当てられているようです。メモリリークはありません(valgrindを使用してチェックしました)。これは何らかの未定義の行動ですか、それとも合法ですか?"this"ポインタのconst_castは未定義の動作ですか?

#include <iostream> 

using namespace std; 

class A 
{ 
    public: 
     A() : x(0) 
     { 
     A *tmp = const_cast<A*>(this); 
     *tmp = A(10); 
     } 

     A(int x) 
     { 
     this->x = x; 
     } 

     int getX() const 
     { 
     return x; 
     } 

    private: 
     int x; 
}; 

int main() 
{ 
    A a; 

    cout << a.getX() << endl; 

    return 0; 
} 
+3

'this'はコンストラクタでconstであるべきではないので、const-castは何もしません。 – tkausl

+1

"メモリリークはありません" - このソース全体に単一の動的割り当てがないので、私は望んでいません。それにもかかわらず、私はなぜあなたが*コンストラクタ*で 'this'を' const_fast'したいのか尋ねます。 – WhozCraig

+0

'const_cast'はそれとは関係ありません。あなたは '* this = A(10)'を行うことができます。または 'x = 10' :-) –

答えて

4

const_castは、発生する動作とは関係ありません。あなたのコードは次のように簡略化することができる:オブジェクトthisため

  1. コンストラクタ本体の前にメモリ:私たちは、既定のコンストラクタを使用してオブジェクトを作成したい場合

    A() : x(0) 
        { 
        *this = A(10); 
        } 
    

    だから、ここ次の処理が行われ予約されています。

  2. x(0)0は、メンバーxthisと割り当てられています。
  3. A(10)Aの新しい(無名の)オブジェクトは、コンストラクタA(int)を使用して作成されます。この新しいオブジェクトメンバxの値は10です。
  4. this =名前なしオブジェクトが割り当てられます(フィールドワイズの自動生成コピー代入演算子を使用)。*this。したがって、メンバーxの値は、thisの値10である。
  5. その行の後一時的な名前のないオブジェクトは破棄されます。
  6. thisが返されます。

これは完全に合法で期待される動作です。

+0

説明をありがとう – bercik

関連する問題