带有指针的模板 class 的析构函数

destructor of template class with pointer

我有一个问题。 考虑这个模板 class

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

假设我没有重新定义析构函数。如果我们假设 T=int,则标准析构函数会释放数据。但是如果 T=int* 会发生什么?只是指针要被释放还是对象也被指向了?理论上只是指针。

如何取消分配指向的对象? 最后,我如何编写一个模板 class 的析构函数,它有一个模板参数可以是一个指针(以及显式释放)?

您需要的是指针类型的部分专用模板:

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; }
};

您最好的选择是使用 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 and The Rule of Five 相关的问题。