分享方式:


警告 C26401

請勿刪除不是 owner<T> 的原始指標 (i.11)

備註

這項檢查會偵測移轉至 owner<T> 的程式碼,對於重構的第一個階段而言可能是個好選項。 如同 C26400,它會強制執行規則 I.11 和 R.3,但著重于指標存留期的「發行」部分。 如果其目標不是 owner<T> 或隱含的擁有者,則會在任何對操作員 delete 的呼叫上發出警告。 如需宣告的詳細資訊 auto ,請參閱 C26400 。 這項檢查包含參考全域變數、正式參數等的運算式。

C26400 和 C26401 一律會發生 警告 C26409 ,但更適合立即移轉至智慧型指標的案例。 在這種情況下,可以先採用概 owner<T> 念,並暫時隱藏 C26409。

程式碼分析名稱: DONT_DELETE_NON_OWNER

另請參閱

C++ 核心指導方針 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++ 核心指導方針不建議使用此模式。 您可以使用 屬性隱藏警告 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};
};