Warning C26409
Avoid calling
new
anddelete
explicitly, usestd::make_unique<T>
instead (r.11).
Even if code is clean of calls to malloc
and free
, we still suggest that you consider better options than explicit use of operators new
and delete
.
C++ Core Guidelines:
R.11: Avoid calling new and delete explicitly
The ultimate fix is to use smart pointers and appropriate factory functions, such as std::make_unique
.
Remarks
- The checker warns on calls to any kind of operator
new
ordelete
: scalar, vector, overloaded versions (global and class-specific), and placement versions. The placementnew
case may require some clarifications in the Core Guidelines for suggested fixes, and may be omitted in the future.
Code analysis name: NO_NEW_DELETE
Examples
This example shows C26409 is raised for explicit new
and delete
. Consider using smart pointer factory functions such as std::make_unique
instead.
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
}
There's a C++ idiom that triggers this warning: delete this
. The warning is intentional, because the C++ Core Guidelines discourage this pattern. You can suppress the warning by using the gsl::suppress
attribute, as shown in this example:
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};
};
Feedback
https://aka.ms/ContentUserFeedback.
În curând: Pe parcursul anului 2024, vom elimina treptat Probleme legate de GitHub ca mecanism de feedback pentru conținut și îl vom înlocui cu un nou sistem de feedback. Pentru mai multe informații, consultați:Trimiteți și vizualizați feedback pentru