警告 C26409
呼び出し
new
をdelete
避け、明示的に使用std::make_unique<T>
してください (r.11)。
コードに malloc
と free
の呼び出しがない場合でも、演算子 new
と delete
の明示的な使用よりも適切なオプションを検討することをお勧めします。
C++ Core Guidelines:
R.11: new と delete を明示的に呼び出すことを避ける
最終的な修正方法は、スマート ポインターと std::make_unique
などの適切なファクトリ関数を使用することです。
解説
- チェッカーは、
new
またはdelete
演算子の任意の種類であるスカラー、ベクター、オーバーロードされたバージョン (グローバルおよびクラス固有)、および配置バージョンの呼び出しについて警告します。 配置new
ケースでは、推奨される修正について、Core Guidelines のいくつかの説明が必要になる場合があります。今後は省略される可能性があります。
コード分析名: NO_NEW_DELETE
例
この例では、明示的な new
と delete
に対して C26409 が発生していることが示されています。 代わりに、std::make_unique
などのスマート ポインター ファクトリ関数を使用することを検討してください。
void f(int i)
{
int* arr = new int[i]{}; // C26409, warning is issued for all new calls
delete[] arr; // C26409, warning is issued for all delete calls
auto unique = std::make_unique<int[]>(i); // prefer using smart pointers over new and delete
}
この警告をトリガーする 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};
};