警告 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
案例可能需要在核心指南中对建议的修复进行一些说明,并且将来可能会省略。
代码分析名称: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};
};