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

时间:2020-06-29 22:02:07

标签: c++ cpp-core-guidelines

当我使用以下代码时,收到警告(通过应用cppcoreguideline)。 代码:

library(tidyr)
library(dplyr)
data %>% 
    group_by(key) %>%
    nest(my_data = -group_cols())
# A tibble: 26 x 2
# Groups:   key [26]
#   key   my_data         
#   <chr> <list>          
# 1 a     <tibble [2 × 2]>
# 2 b     <tibble [2 × 2]>
# 3 c     <tibble [2 × 2]>
# 4 d     <tibble [2 × 2]>
# 5 e     <tibble [2 × 2]>
# 6 f     <tibble [2 × 2]>
# 7 g     <tibble [2 × 2]>
# 8 h     <tibble [2 × 2]>
# 9 i     <tibble [2 × 2]>
#10 j     <tibble [2 × 2]>
# … with 16 more rows

警告:

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

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

我听不懂, 有人可以用简单的术语来对此进行解释。

1 个答案:

答案 0 :(得分:5)

gsl::owner<T*>旨在表示谁拥有此对象的人是基础T对象的所有者,并负责稍后释放内存。请注意,仍然需要显式删除操作-GSL批注旨在协助静态分析工具。 (有关所有权的更多信息,请参见this post。)

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

要解决此错误,您可以使用gsl :: owner明确地手动注释对象,例如gsl::owner<SampleClass*> object;

另一种可能更简单的选择是使用std::unique_ptr(通常通过std::make_unique<SampleClass>()),这将在编译时提供强大的安全保证(即使不使用clang-tidy等其他分析器)正确使用。它还会自动删除对象,而gsl :: owner不会。

相关问题