2016-06-07 101 views
0

我有一个问题。 考虑这个模板类模板类与指针的析构函数

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

让我们假设,我不是重新定义析构函数。如果我们假设T = int,则标准析构函数将取消分配数据。但是如果T = int *会发生什么?只是指针将被释放或对象指向了?理论上只是指针。

如何取消分配指向的对象? 最后,我该如何编写一个模板类的析构函数,该模板类的模板参数可能是一个指针(以及明确的重新分配)?

+4

简单修复,使'T'为'unique_ptr '代替。然后指向的对象会自动销毁 – vu1p3n0x

+2

这与您完成'class nodo {public:int * data;}'没有区别。 – GManNickG

+0

@ vu1p3n0x,即使数据不是指针,unique_ptr也可以工作吗? – CodeBott

回答

2

你最好的选择是使用std::unique_ptr<int>std::shared_ptr<int>作为模板参数,即使用

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

代替

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 '。当节点意图保存指针时,使用'nodo >'而不是'node ''。 –

+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

它看起来是一个很好的解决方案。我对其他想法很感兴趣。谢谢 – CodeBott

+0

当T是一个指针时,至少禁止复制类。否则,如果班级被复制,你将拥有UB。 –