警告 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
另請參閱
範例
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};
};