2013-02-23 2 views
0

얼마 전에 boost :: variant를 사용했는데 이제는 어떻게 내부적으로 작동하는지 알아 내려고하고 있습니다. 간단한 테스트를 작성했는데 그 결과를 이해할 수 없습니다. 여기가boost :: variant 개체 생성 횟수 VS 파괴 횟수

struct my_type 
{ 
    my_type(){ cout << (size_t)this << " construction"; } 
    ~my_type(){ cout << (size_t)this << " destruction"; } 
}; 

int main() 
{ 
    variant<int, my_type> x; 
    x = my_type(); 
} 

같은 프로그램의 출력은

140736940365327 construction <-- A 
140736940365236 destruction <-- ? 
140736940365327 destruction <-- A 
140736940365332 destruction <-- ? 

입니다 (간체) 왜 소멸자 생성자로 여러 번 호출되지 않습니다 도대체? 소멸자가 힙을 통해 호출 될 때, 나는 이것이 세분화되지 않을 수도 있다는 것을 알고 있지만,이 동작은 위험한 것으로 보인다. 내가 놓친 게 있니? 이것은 boost :: variant의 "backup"메커니즘과 관련이 있습니까?

+2

클래스에 복사 생성자를 추가합니다. – Mat

답변

2

기본 생성자 만 정의했지만 물론 다양한 매개 변수로 생성자를 호출 할 수도 있습니다. 컴파일러 (명시 적으로 복사 생성자 (const my_type&을 사용하는 생성자)를 명시 적으로 정의하지 않으므로 컴파일러에서 암시 적으로 생성자를 생성합니다. 당신이 C++ 11 컴파일러, 암시 적으로 생성 된 이동 생성자를 사용하는 경우, 사실

struct my_type 
{ 
    my_type(){ cout << (size_t)this << " construction"; } 
    my_type(const my_type&){ cout << (size_t)this << " copy construction"; } 
    ~my_type(){ cout << (size_t)this << " destruction"; } 
}; 

: 당신이 당신의 자신의 복사 생성자를 추가하는 경우, 당신은 다른 두 신비한 물체를 구성하는 데 사용되는 것을 볼 수 새로운 객체의 일부를 책임질 것입니다. 위와 같이 복사 생성자를 제공하면 암시 적 이동 생성자는 더 이상 생성되지 않으므로 모두 복사 구성으로 표시됩니다. 그러나 이동 생성자도 제공하면

struct my_type 
{ 
    my_type(){ cout << (size_t)this << " construction"; } 
    my_type(const my_type&){ cout << (size_t)this << " copy construction"; } 
    my_type(my_type&&){ cout << (size_t)this << " move construction"; } 
    ~my_type(){ cout << (size_t)this << " destruction"; } 
}; 
+0

그래서 기본 생성자를 정의하지 않으면 암시 적으로 호출됩니다. – neodelphi

+0

@neodelphi 예, 컴파일러는 정의하지 않으면 컴파일러를 암시 적으로 생성합니다. –

+0

감사합니다. 설명해주세요! – neodelphi