警告 C26401
请勿删除不是
owner<T>
的原始指针 (i.11)
备注
此检查可检测移动到 owner<T>
适用于重构第一阶段的代码。 与 C26400 一样,它强制实施规则 I.11 和 R.3,但侧重于指针生存期的“释放”部分。 如果目标不是 delete
或隐式假定的所有者,则会对任何运算符 owner<T>
的调用发出警告。 有关 auto
声明的详细信息,请参阅 C26400。 检查对象包括引用全局变量、形参等的表达式。
警告 C26400 和 C26401 始终与 C26409 一起出现,但它们更适用于不可立即迁移到智能指针的方案。 在这种情况下,可以首先采用 owner<T>
概念,可能会暂时抑制 C26409。
代码分析名称:DONT_DELETE_NON_OWNER
另请参阅
示例
struct myStruct {};
myStruct* createMyStruct();
void function()
{
myStruct* pMyStruct = createMyStruct();
// ...
delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}
如下所示,如果 gsl::owner 指示了指针的所有权,则会删除 C26401。
#include <gsl/pointers>
struct myStruct {};
gsl::owner<myStruct*> createMyStruct();
void function()
{
gsl::owner<myStruct*> pMyStruct = createMyStruct();
// ...
delete pMyStruct; // no warning.
}
有 C++ 习语会触发此警告:delete this
。 警告是有意的,因为 C++ Core Guidelines 不建议使用此模式。 可以使用 gsl::suppress
属性抑制警告,如下例所示:
class MyReferenceCountingObject final
{
public:
void AddRef();
void Release() noexcept
{
ref_count_--;
if (ref_count_ == 0)
{
[[gsl::suppress(i.11)]]
delete this;
}
}
private:
unsigned int ref_count_{1};
};