次の方法で共有


警告 C26409

呼び出し newdelete 避け、明示的に使用 std::make_unique<T> してください (r.11)。

コードに mallocfree の呼び出しがない場合でも、演算子 newdelete の明示的な使用よりも適切なオプションを検討することをお勧めします。

C++ Core Guidelines:
R.11: new と delete を明示的に呼び出すことを避ける

最終的な修正方法は、スマート ポインターと std::make_unique などの適切なファクトリ関数を使用することです。

解説

  • チェッカーは、new または delete 演算子の任意の種類であるスカラー、ベクター、オーバーロードされたバージョン (グローバルおよびクラス固有)、および配置バージョンの呼び出しについて警告します。 配置 new ケースでは、推奨される修正について、Core Guidelines のいくつかの説明が必要になる場合があります。今後は省略される可能性があります。

コード分析名: NO_NEW_DELETE

この例では、明示的な newdelete に対して 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};
};