【问题标题】:C++ Warning: Assigning newly created gsl::owner<> to non-ownerC++ 警告:将新创建的 gsl::owner<> 分配给非所有者
【发布时间】:2020-10-20 03:50:32
【问题描述】:

当我使用以下代码时,我收到一条警告(来自应用 cppcoreguideline)。 代码:

 SampleClass *object = nullptr;
 object = new SampleClass();

警告:

 warning: assigning newly created 'gsl::owner<>' to non-owner 'SampleClass *' [cppcoreguidelines-owning-memory]

当我搜索并访问此链接时 https://releases.llvm.org/8.0.1/tools/clang/tools/extra/docs/clang-tidy/checks/cppcoreguidelines-owning-memory.html

我无法理解, 有人可以简单地解释一下吗?

【问题讨论】:

    标签: c++ cpp-core-guidelines


    【解决方案1】:

    gsl::owner&lt;T*&gt; 表示持有此对象的人是底层T 对象的所有者,并负责稍后释放内存。请注意,仍然需要显式删除操作 - GSL 注释旨在辅助静态分析工具。 (有关所有权的更多信息,请参阅this post。)

    当您将 gsl::owner 分配给 原始指针(例如 SampleClass *object)时,所有权语义丢失并且静态分析器(在本例中为 clang-tidy)无法验证object 以后会正确使用。这就是在这种情况下您会收到警告的原因:因为丢失此信息是一个坏主意,并且通常会导致代码不正确。

    要修复此错误,您可以显式使用 gsl::owner 手动注释对象,例如 gsl::owner&lt;SampleClass*&gt; object;

    另一个可能更简单的替代方法是使用std::unique_ptr(通常通过std::make_unique&lt;SampleClass&gt;()),只要使用得当,它将在编译时提供强大的安全保证(即使不使用像clang-tidy这样的其他分析器) .它还会自动删除对象,而 gsl::owner 不会。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 2022-06-23
      • 1970-01-01
      • 2020-06-11
      相关资源
      最近更新 更多