2014-09-08 8 views
0

저는 C++ 라이브러리를 작성 중이며 클래스 중 하나를 암시 적으로 공유하려고합니다. 불행히도 나는 그 구현과 약간 혼란스러워진다. 나는 데이터를 저장하기 위해 std::shared_ptr을 사용하고 싶습니다. 그리고 아래의 코드가 아무것도 없는지 궁금합니다. shared_ptr 멤버 및 복사 생성자


// MyClass.cc 
class MyClass::Data 
{ 
public: 
    Data (void) { ptr = NULL; } 
    ~Data (void) { delete ptr; } 
    int* ptr; 
}; 

MyClass::MyClass (void) 
    : mData (new MyClass::Data()) 
{ 
    mData->ptr = new int(5); 
} 

// MyClass.h 
class MyClass 
{ 
public: 
    MyClass (void); 

private: 
    class Data; 
    std::shared_ptr<Data> mData; 
}; 

다른 사람의 코드를 보면 나는 그들이 및 빈 소멸자 (표준 : 이동 등을 사용하여) 복사/이동 생성자/연산자를 추가 나타났습니다. 의견 중 하나는 MyClass :: Data의 소멸자가 컴파일러에 의해 발견되도록 MyClass에 빈 소멸자가 필요하다는 것을 언급했습니다. 위의 코드가 실제로 필요한가 아니면 충분합니까? 기본 복사/이동 생성자/연산자와 소멸자가 충분합니까?

+0

'mData' 포인팅 데이터를 공유하려는 경우 복사 생성자와 할당 연산자가 필요하지 않습니다. 기본 설정은 괜찮습니다. – 101010

+1

시도해 보셨습니까? –

+0

'MyClass :: Data :: ptr' 멤버에 대해'std :: unique_ptr' 또는'std :: shared_ptr'을 사용하지 않을까요? –

답변

1

코드가 정상입니다. 데이터를 딥 - 카피 (deep-copy)하려는 경우에 대비하여 복사본 생성자를 선언하고 싶지만 공유 포인터를 사용하는 목적에 위배된다. 빈 소멸자 설명이 완료되었습니다. 소멸자를 제공하지 않으면 기본 클래스가 사용됩니다. 어쨌든 멤버 클래스의 소멸자가 항상 호출됩니다.

std::shared_ptr 대신 std::unique_ptr을 사용하고 있기 때문에 MyClass.cc에서 소멸자 (및 할당 연산자)를 명시 적으로 기본값으로 설정해야하는 사람들을 볼 수 있습니다. std::unique_ptr<Data>을 사용하면 컴파일러가 제공하는 소멸자 등이 범위에있는 ~Data에 대한 정의를 찾을 수 없을 때 barf로 표시됩니다. 그러나 barf에는 std::shared_ptr을 사용할 수 없습니다.

+0

그래, 그게 내가 생각했던거야. 그래서 내가이 일을하는 사람들을 보았을 때 혼란스러워했다. ** [여기] (http://ideone.com/hYnECo) **는 내 질문에 대한 예입니다. 예상대로 작동하는 것을 볼 수 있습니다. – Dave