我正在做一个包含指针和动态内存的列表的列表,它的主要列表是由节点组成的,每个节点可以是另一个列表或任何类型的类型(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);
}