如何删除通用容器中的列表?

时间:2014-11-26 01:44:11

标签: c++ list templates containers delete-operator

我正在使用指针和dinamic内存列表,主要列表由节点组成,每个节点可以是另一个列表或任何类型的类型(int,double ...)。当我尝试删除所有内容时出现错误:

  

C2541:'删除':无法删除不是指针的对象。

List的析构函数:

虽然列表不为空,但我删除了它的第一个元素。

template <class T> Lista<T>::~Lista()
{
  while ( !es_vacia() )
  {
    borrar(1);
  }
}

Node的析构函数:

函数borrar(1)调用节点的析构函数。它将指针设置为null(它是一个双向链表)然后如果类T是一个指针删除它(因为它包含一个列表)但它不起作用。

template <class T> Nodo<T>::~Nodo()
{
  sig = 0;
  ant = 0;
  if (std::is_pointer<T>::value)
  {
    delete valor;
  } 
}

1 个答案:

答案 0 :(得分:2)

我和评论者一致认为,如果用户希望您的列表获取指针的所有权,他们应该声明它Lista<std::unique_ptr<T>>。这样,如果他们想继续以其他方式拥有他们的指针,那仍然是一个选择。

但要回答你的问题...如果你想能够拥有一个泛型类型,当模板参数是一个指针时删除指针,你必须将你的delete移动到一个类或函数中总是指针。这是一种方法:

template <class T, bool isPointer = std::is_pointer<T>::value>
struct ItemCleanup
{
    // default case, does nothing
    static void cleanup(T value) { }
};

template <class T>
struct ItemCleanup<T, true>
{
    // specialized case if is_pointer<T>::value is true
    static void cleanup(T value) { delete value; }
};

template <class T>
Nodo<T>::~Nodo()
{
    ItemCleanup<T>::cleanup(valor);
}