警告 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

另请参阅

C++ Core Guidelines I.11

示例

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};
};