警告 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++ 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};
};