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