【问题标题】:How to "reset" gsl::owner<T>?如何“重置”gsl::owner<T>?
【发布时间】:2020-06-11 21:04:39
【问题描述】:

当我创建一个对象并将其附加到列表时

auto o = new object;
m_objects.push_back(o);

我从编译器那里得到了一些提示,我应该按照 C++ 核心检查指南清理我的代码,其中包括

  • 不要直接使用newdelete,使用unique_ptr(VC++警告C26409)
  • 重置或显式 delete 一个 owner&lt;T&gt; 指针(VC++ 警告 26403)

后者让我很感兴趣:鉴于我已将所有权转移给list,我应该如何“重置”这个指针,以便编译器不会在此处警告我?分配 nullptr 会给我一个额外的警告

  • 不要分配给可能处于有效状态的owner&lt;T&gt;(VC++ 警告 26405)

并没有清除最初的投诉,所以不是这样。

【问题讨论】:

  • 在列表超出范围之前,或者当您从列表中删除项目或重新分配列表中的项目时,您必须在指针上调用deletem_objects 在销毁时会为其中包含的所有对象调用析构函数,但指针没有析构函数。
  • 你有一个指针列表,而不是对象列表,即列表不拥有对象
  • m_objects的类型是什么? std::list&lt;object*&gt;?
  • 啊,所以std::list&lt;gsl::owner&lt;object *&gt;&gt; 会让push_back 获取一个所有者指针,这将转移所有权并从检查者的角度算作“重置”?
  • 尽可能使用std::unique_ptr。仅当不可能使用gsl::owner。比较isocpp.github.io/CppCoreGuidelines/…

标签: c++ cpp-core-guidelines


【解决方案1】:

警告 C26403:重置或显式删除所有者指针“p” (r.3)。

在这个例子中可以看到两个部分(“reset”和“explicitly delete”):

gsl::owner<char*> p = new char{}; // take ownership
gsl::owner<char*> q = p;          // copy ownership -> problem
p = nullptr;                      // p is reset to release ownership
delete q;                         // second is owner, needs explicit delete

p 被复制到 q,然后重置为只存在一个所有者。
q 被显式删除。

只是重置而不像 in 那样放弃所有权

gsl::owner<char*> p = new char{};
p = nullptr;

当然是内存泄漏,因此证明了

警告 C26405:不要分配给可能处于有效状态 (r.3) 的所有者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2017-12-17
    • 1970-01-01
    • 2017-04-07
    • 2018-07-06
    相关资源
    最近更新 更多