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


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


列表的析构函数:

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

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


节点的析构函数:

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

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

最佳答案

我和评论者在一起,一种更好的处理方法是,如果用户希望您的列表拥有指针的所有权,则应将其声明为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);
}

09-10 02:02
查看更多