【发布时间】:2019-10-07 12:51:02
【问题描述】:
template<class I>
class list_node {
public:
I val;
list_node(list_node<I>* p, list_node<I>* n, I value) :prev(p), next(n), val(value) {};
list_node(I value) :list_node(NULL, NULL, value) {};
list_node<I>* next;
list_node<I>* prev;
~list_node() { if (std::is_pointer<I>::value) { delete I; } }
};
我有这样的课。用户可以将指针类型作为“I”参数传递,因此我必须动态删除创建对象。但是 VS 2019 显示错误“我无法删除不是指针的对象”。 请告诉我如何解决这个问题。我不会专门研究这个类(除非有其他解决方案)。
【问题讨论】:
-
用户可以将指针类型作为“I”参数传递,所以我必须动态删除创建一个对象。这是用户的责任,不是你的。就像
std::vector<int*>在销毁时不会在指针上调用delete一样,您的喜欢列表也不应该。如果班级的用户想要这样,那么他们应该给你一个合适的 RAII 类型,比如std::unique_ptr -
尝试使用 constexpr-if:
if constexpr (std::is_pointer_v<I>) { delete I; } -
请提供minimal reproducible example。如果 VS 告诉您它无法删除您传递的类型,很可能是因为您将
I作为int或类似的不是指针的东西传递。 -
在
int a = 5; list_node<int*> (&a);、delete这样的指针的情况下,会调用未定义的行为。
标签: c++ list pointers memory-management