【问题标题】:How to delete variable which can be pointer (template)?如何删除可以是指针(模板)的变量?
【发布时间】: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&lt;int*&gt; 在销毁时不会在指针上调用delete 一样,您的喜欢列表也不应该。如果班级的用户想要这样,那么他们应该给你一个合适的 RAII 类型,比如std::unique_ptr
  • 尝试使用 constexpr-if: if constexpr (std::is_pointer_v&lt;I&gt;) { delete I; }
  • 请提供minimal reproducible example。如果 VS 告诉您它无法删除您传递的类型,很可能是因为您将 I 作为 int 或类似的不是指针的东西传递。
  • int a = 5; list_node&lt;int*&gt; (&amp;a);delete这样的指针的情况下,会调用未定义的行为。

标签: c++ list pointers memory-management


【解决方案1】:

这是智能指针有用的完美示例。

如果您还没有听说过 std::shared_ptr 和 std::unique_ptr,现在是时候记录一下它们了,它们是安全管理内存的非常有用的工具。

【讨论】:

    【解决方案2】:

    不要删除I 类型的变量。相反,假设I 将自行管理,或者如果不这样做,则假设所有者(新人)将为您清理它。

    就像std::vector 不会删除存储在其中的指针一样,您的容器也不应该这样做。

    我会删除该删除并改用std::unique_ptr

    {
        list_node<std::unique_ptr<int>> my_node{new int{3}};
        // ...
    } // the new int is deleted here
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多