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

相关问题