2016-06-07 5 views
0

질문이 있습니다. 이 템플릿 클래스를포인터가있는 템플릿 클래스의 소멸자

template<class T> 
class nodo{ 
public: 
    T data; 
}; 

을 고려 의 내가 소멸자를 재정의 아니에요 가정하자. T = int라고 가정하면 표준 소멸자는 데이터를 할당 해제합니다. 그러나 T = int *이면 어떻게 될까요? 포인터가 할당 해제 될 것인가 아니면 객체가 가리키고 있는가? 이론 상으로는 포인터.

어떻게 객체를 할당 해제 할 수 있습니까? 결국, 포인터가 될 수있는 템플릿 매개 변수를 가진 템플릿 클래스의 소멸자를 작성하려면 어떻게해야합니까 (따라서 명시 적 할당 취소)? 당신이 필요로하는 무엇

+4

쉬운 수정,'T는'unique_ptr '이되도록하십시오. 그러면 pointed-to 객체는 자동으로 소멸됩니다. – vu1p3n0x

+2

'class nodo {public : int * data;}'와 다른 점이 없습니다. – GManNickG

+0

@ vu1p3n0x, 데이터가 포인터가 아니더라도 unique_ptr이 작동합니까? – CodeBott

답변

2

당신의 최선의 선택, 즉 대신

nodo<std::unique_ptr<int>> n1; 

를 사용하여 템플릿 인수로 std::unique_ptr<int> 또는 std::shared_ptr<int>을 사용하는 것입니다

nodo<int*> n1; 

다음과 같이 시도해보십시오.

// Noop deleter 
template <typename T> struct deleter 
{ 
    void operator()(T& ptr) {} 
}; 

// deleter that does something 
template <typename T> struct deleter<T*> 
{ 
    void operator()(T* ptr) { delete ptr; } 
}; 


template<class T> 
class nodo{ 
public: 
    using deleter_t = deleter<T>; 
    T data; 

    ~nodo() 
    { 
     deleter_t()(data); 
    } 
}; 

그러나 다른 웜에 대해 걱정해야합니다. nodo이 복사 생성되었거나 다른 nodo 개체에 할당되면 어떻게됩니까? The Rule of ThreeThe Rule of Five과 관련된 모든 문제를 처리해야합니다.

+0

고맙지 만 데이터가 포인터가 아니더라도 작동합니까? – CodeBott

+1

@CodeBott,'int' 타입의 노드에'nodo '을 사용하십시오. 노드가 포인터를 가지고있을 때'node '대신'nodo >'을 사용하십시오. –

+0

아주 멋져 보인다! 나는 Thx를 시도 할 것이다. – CodeBott

0

포인터 유형에 대해 부분적으로 전문화 된 템플릿입니다 :

template<typename T> class Test { 
    T val; 
public: 
    Test(T const &v) : val(v) {} 
}; 

// Specialize for pointers 
template<typename T> class Test<T*> { 
    T* val; 
public: 
    Test(T* v) : val(v) {} 
    ~Test() { delete val; } 
}; 
+0

좋은 해결책으로 보입니다. 나는 다른 아이디어를 waintg 해요. 감사합니다 – CodeBott

+0

적어도 T가 포인터 일 때 클래스의 복사를 금지합니다. 그렇지 않으면 클래스가 항상 복사되면 UB가 생깁니다. –

관련 문제