Share via


警告 C26401

(i.11) ではない生ポインターを owner<T> 削除しないでください

解説

このチェックは、リファクタリングowner<T>の第 1 段階に適したオプションになる可能性があるコードを検出します。 C26400 と同様に規則 I.11 と R.3 を適用しますが、ポインターの有効期間のうち "解放" の部分に焦点を当てます。 ターゲットが owner<T> または暗黙的に想定された所有者ではない場合、演算子 delete への呼び出しに関する警告になります。 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};
};