警告 C26409

避免显式调用 newdelete,改用 std::make_unique<T> (r.11)。

即使代码没有对 mallocfree 的调用,我们仍然建议考虑比明确使用运算符 newdelete 更好的选择。

C++ Core Guidelines:
R.11:避免显式调用 new 和 delete

最终的解决方法是使用智能指针和适当的工厂函数,例如 std::make_unique

备注

  • 检查器会在调用任何类型的运算符 newdelete 时发出警告:标量、向量、重载版本(全局和特定于类)和放置版本。 放置 new 案例可能需要在核心指南中对建议的修复进行一些说明,并且将来可能会省略。

代码分析名称: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};
};