2017-03-14 28 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

「沒有內存泄漏」 - 我不希望這樣,因爲在整個源代碼中沒有一個動態分配。無論如何,我敢問你爲什麼要在構造函數中const_fast這個'this'? – WhozCraig

+0

'const_cast'與它無關。你可以做'* this = A(10)'。或'x = 10' :-) –

回答

4

const_cast與您所遇到的行爲沒有任何關係。你的代碼可以簡化爲以下幾點:

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

所以,這裏將發生以下情況,如果我們想使用默認的構造函數創建一個對象:

  1. 之前的構造體內存爲對象this被預定了。
  2. x(0)0被分配給xthis的成員。
  3. A(10)使用構造函數A(int)創建類A的新(未命名)對象。這個新對象成員x的值爲10
  4. this =這裏未命名的對象被分配(使用自動生成的複製賦值運算符,這是字段方式)到*this。因此,this的成員x的值成爲10
  5. 此行後臨時未命名對象被銷燬。
  6. this被返回。

這是完全合法和預期的行爲。

+0

感謝您的解釋 – bercik

相關問題