Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
No elimine un puntero sin formato que no sea (
owner<T>i.11)
Comentarios
Esta comprobación detecta código al que mover a owner<T> puede ser una buena opción para la primera fase de refactorización. Al igual que C26400, aplica las reglas I.11 y R.3, pero se centra en la parte de "versión" de la duración del puntero. Advierte sobre cualquier llamada al operador delete si su destino no es owner<T> o un propietario asumido implícitamente. Para más información sobre las declaraciones auto, consulte C26400. Esta comprobación incluye expresiones que hacen referencia a variables globales, parámetros formales, etc.
Las advertencias C26400 y C26401 siempre se producen con C26409, pero son más adecuadas para escenarios en los que la migración inmediata a punteros inteligentes no es factible. En tales casos, el concepto owner<T> se puede adoptar primero y C26409 puede suprimirse temporalmente.
Nombre de análisis de código: DONT_DELETE_NON_OWNER
Consulte también
Directrices básicas de C++ I.11
Ejemplos
struct myStruct {};
myStruct* createMyStruct();
void function()
{
myStruct* pMyStruct = createMyStruct();
// ...
delete pMyStruct; // C26401. Do not delete a raw pointer that is not an owner<T>
}
Vea que C26401 se quita si la propiedad del puntero se indica mediante gsl::owner.
#include <gsl/pointers>
struct myStruct {};
gsl::owner<myStruct*> createMyStruct();
void function()
{
gsl::owner<myStruct*> pMyStruct = createMyStruct();
// ...
delete pMyStruct; // no warning.
}
Hay una expresión de C++ que desencadena esta advertencia: delete this. La advertencia es intencionada, ya que en C++ Core Guidelines se desaconseja este patrón. Puede suprimir la advertencia mediante el atributo gsl::suppress, como se muestra en este ejemplo:
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};
};