2014-02-15 1 views
1

에 메모리를 할당하지 않고 나는 어떤 의미가 없습니다표준은 :: <T> unique_ptr 힙

std::unique_ptr<Thing> m_thing; 
m_thing->DoStuff(); 

대신

std::unique_ptr<Thing> m_thing(new Thing); 
m_thing->DoStuff(); 

첫 번째 예제 컴파일 및 실행, 같은 실수로 문을 썼다 왜냐하면 m_thing이 어떤 객체를 가리키고 있지 않기 때문입니다. 여기 약간 더 큰 코드 예제.

#include <iostream> 
#include <memory> 
class Thing 
    { 
    public: 
    ~Thing(){ std::cout << "destructor of class Thing\n"; } 
    void DoStuff(){ std::cout << "doing stuff\n"; } 
    }; 

void Foo() 
    { 
    std::unique_ptr<Thing> m_thing; 
    m_thing->DoStuff(); //why does this work, since i suppose m_thing to be empty? 
    } 

int main() 
    { 
    Foo(); 
    std::cout << "after Foo()\n"; 
    std::cin.get(); 
    return 0; 
    } 

왜 "빈"m_thing unique_ptr이 DoStuff() - 방법 클래스를 호출 할 수 있습니까? 그래서,

std::unique_ptr<Thing> m_thing; 

대신 내가 구글을 통해이 동작의 설명을 발견하지 않았다

std::unique_ptr<Thing> m_thing(new Thing); 

와 을 m_thing 선언 할 때 것-클래스의 소멸자가 호출되지 도착 결코 또한 발견 누군가 커튼 뒤로 무슨 일이 일어 났는지 설명해 줄 수 있기를 바랍니다.

답변

4

프로그램이 정의되지 않은 동작을 보입니다. "일하는 것"은 정의되지 않은 행동의 한 가능한 징후입니다. 도덕적으로는

입니다.
Thing* p = NULL; 
p->DoStuff(); 

도 컴파일되고 실행됩니다. DoStuffthis 포인터에 대해 NULL과 함께 호출됩니다. 실제로는 this을 사용하지 않으므로 예상대로 충돌 및 기록되지 않습니다.

4

DoStuff은 가상이 아니며 개체의 멤버에 액세스하지 않으므로 호출 할 수 있습니다 (이 동작은 확실하지 않습니다.). unique_ptr의 기본 생성자는이 값을 nullptr으로 초기화하므로 임의의 메모리를 자체적으로 할당하지 않습니다.

아, unique_ptr이 nullptr에서 해당 Deleter를 호출하지 않기 때문에 물론 소멸자가 호출되지 않습니다.