【发布时间】:2020-06-11 21:04:39
【问题描述】:
当我创建一个对象并将其附加到列表时
auto o = new object;
m_objects.push_back(o);
我从编译器那里得到了一些提示,我应该按照 C++ 核心检查指南清理我的代码,其中包括
- 不要直接使用
new和delete,使用unique_ptr(VC++警告C26409) - 重置或显式
delete一个owner<T>指针(VC++ 警告 26403)
后者让我很感兴趣:鉴于我已将所有权转移给list,我应该如何“重置”这个指针,以便编译器不会在此处警告我?分配 nullptr 会给我一个额外的警告
- 不要分配给可能处于有效状态的
owner<T>(VC++ 警告 26405)
并没有清除最初的投诉,所以不是这样。
【问题讨论】:
-
在列表超出范围之前,或者当您从列表中删除项目或重新分配列表中的项目时,您必须在指针上调用
delete。m_objects在销毁时会为其中包含的所有对象调用析构函数,但指针没有析构函数。 -
你有一个指针列表,而不是对象列表,即列表不拥有对象
-
m_objects的类型是什么?std::list<object*>? -
啊,所以
std::list<gsl::owner<object *>>会让push_back获取一个所有者指针,这将转移所有权并从检查者的角度算作“重置”? -
尽可能使用
std::unique_ptr。仅当不可能使用gsl::owner。比较isocpp.github.io/CppCoreGuidelines/…。