Warnung C26409
Vermeiden Sie anrufe
new
unddelete
explizit, verwendenstd::make_unique<T>
Sie stattdessen (r.11).
Auch wenn Code von Aufrufen malloc
sauber ist und free
wir dennoch empfehlen, bessere Optionen als die explizite Verwendung von Operatoren new
und delete
.
C++-Kernrichtlinien:
R.11: Vermeiden sie explizites Aufrufen neuer und löschen
Der ultimative Fix ist die Verwendung intelligenter Zeiger und geeigneter Werksfunktionen, z std::make_unique
. B. .
Hinweise
- Die Prüfer warnt bei Aufrufen jeder Art von Operator
new
oderdelete
: Skalar, Vektor, überladene Versionen (global und klassenspezifisch) und Platzierungsversionen. Der Platzierungsfallnew
erfordert möglicherweise einige Klarstellungen in den Kernrichtlinien für vorgeschlagene Fixes und kann in Zukunft weggelassen werden.
Codeanalysename: NO_NEW_DELETE
Beispiele
Dieses Beispiel zeigt, dass C26409 für explizit und explizit new
delete
ausgelöst wird. Erwägen Sie stattdessen die Verwendung intelligenter Zeigerfabrikfunktionen, z std::make_unique
. B.
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
}
Es gibt einen C++-Idiom, der diese Warnung auslöst: delete this
. Die Warnung ist beabsichtigt, da die C++-Kernrichtlinien dieses Muster davon abhalten. Sie können die Warnung mithilfe des gsl::suppress
Attributs unterdrücken, wie in diesem Beispiel gezeigt:
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};
};