我正在使用指针和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;
}
}
答案 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);
}