我有一个问题。 考虑这个模板类模板类与指针的析构函数
template<class T>
class nodo{
public:
T data;
};
让我们假设,我不是重新定义析构函数。如果我们假设T = int,则标准析构函数将取消分配数据。但是如果T = int *会发生什么?只是指针将被释放或对象指向了?理论上只是指针。
如何取消分配指向的对象? 最后,我该如何编写一个模板类的析构函数,该模板类的模板参数可能是一个指针(以及明确的重新分配)?
我有一个问题。 考虑这个模板类模板类与指针的析构函数
template<class T>
class nodo{
public:
T data;
};
让我们假设,我不是重新定义析构函数。如果我们假设T = int,则标准析构函数将取消分配数据。但是如果T = int *会发生什么?只是指针将被释放或对象指向了?理论上只是指针。
如何取消分配指向的对象? 最后,我该如何编写一个模板类的析构函数,该模板类的模板参数可能是一个指针(以及明确的重新分配)?
你最好的选择是使用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 Three和The Rule of Five相关的所有问题。
你需要的是指针类型部分专业模板:
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; }
};
它看起来是一个很好的解决方案。我对其他想法很感兴趣。谢谢 – CodeBott
当T是一个指针时,至少禁止复制类。否则,如果班级被复制,你将拥有UB。 –
简单修复,使'T'为'unique_ptr'代替。然后指向的对象会自动销毁 –
vu1p3n0x
这与您完成'class nodo {public:int * data;}'没有区别。 – GManNickG
@ vu1p3n0x,即使数据不是指针,unique_ptr也可以工作吗? – CodeBott