【问题标题】:destructor of template class with pointer带指针的模板类的析构函数
【发布时间】:2016-10-07 21:36:31
【问题描述】:

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

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

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

如何解除分配指向的对象? 最后,如何编写模板类的析构函数,该类的模板参数可能是指针(以及显式释放)?

【问题讨论】:

  • 简单修复,将T改为unique_ptr&lt;int&gt;。然后指向的对象会自动销毁
  • 这和你做的没什么不同class nodo { public: int* data;}
  • @vu1p3n0x ,即使数据不是指针,unique_ptr 也能工作?

标签: c++ templates pointers destructor


【解决方案1】:

您最好的选择是使用std::unique_ptr&lt;int&gt;std::shared_ptr&lt;int&gt; 作为模板参数,即使用

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 相关的所有问题。

【讨论】:

  • @CodeBott,将nodo&lt;int&gt; 用于int 类型的节点。当节点用于保存指针时,使用nodo&lt;std::unique_ptr&lt;int&gt;&gt; 而不是node&lt;int*&gt;
  • 看起来很不错!我会试试的,谢谢
【解决方案2】:

您需要一个针对指针类型的部分专用模板:

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

【讨论】:

  • 至少在 T 为指针时禁止类的复制。否则,如果曾经复制过课程,您将拥有 UB。
猜你喜欢
  • 2018-03-24
  • 2017-10-20
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-11
  • 1970-01-01
相关资源
最近更新 更多