c++ - C++警告:将新创建的gsl::owner <>分配给非所有者

标签 c++ cpp-core-guidelines

当我使用以下代码时,会收到警告(通过应用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
我不明白
有人可以用简单的术语来解释一下。

最佳答案

gsl::owner<T*>旨在指定拥有此对象的人是底层T对象的所有者,并负责稍后释放内存。请注意,仍然需要显式删除操作-GSL注释旨在帮助静态分析工具。 (有关所有权的更多信息,请参见this post。)
当将gsl::owner分配给原始指针(例如SampleClass *object)时,所有权语义会丢失,并且静态分析器(在这种情况下为clang-tidy)无法验证将来是否正确使用了object。这就是在这种情况下收到警告的原因:因为丢失此信息是一个坏主意,并且通常会导致错误的代码。
要解决此错误,您可以通过显式使用gsl::owner手动注释对象,例如gsl::owner<SampleClass*> object;
另一个可能更简单的选择是使用 std::unique_ptr (通常通过std::make_unique<SampleClass>()),只要正确使用它,就可以在编译时提供强大的安全保证(即使不使用clang-tidy等其他分析器)。它还会自动删除对象,而gsl::owner不会。

关于c++ - C++警告:将新创建的gsl::owner <>分配给非所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62647338/

相关文章:

C++ 停止 for 循环的 "best"方法是什么?

c++ - 函数 'glWindowPos2i' 无法解析?

c++ - CPP 核心指南布局中浪费的空间

c++ - 使用 SSE 指令的 openMP 程序中线程 > 4 的段错误

c++ - std::sort 做了很多不必要的交换

c++ - 让 NetBeans 的 C++ 解析器与 Emscripten 一起工作

c++ - C++ 中类型的单位

c++ - 使用模板来提高代码的抽象层次?

c++ - 如何在没有 clang-tidy 警告的情况下使用 union ?

c++ - 为什么 gsl::not_null 确保 ptr 在 get() 上不为空?