Error: new-delete-type-mismatch
Error AddressSanitizer: tamaño de desasignación diferente del tamaño de asignación
En este ejemplo, solo se llama a ~Base
, y no a ~Derived
. El compilador genera una llamada a ~Base()
porque el destructor Base
no es virtual
. Cuando llamamos a delete b
, el destructor del objeto se enlaza a la definición predeterminada. El código elimina una clase base vacía (o 1 byte en Windows). Que falte una clave virtual
en la declaración del destructor es un error de C++ común al usar la herencia.
Ejemplo: destructor virtual
// example1.cpp
// new-delete-type-mismatch error
#include <memory>
#include <vector>
struct T {
T() : v(100) {}
std::vector<int> v;
};
struct Base {};
struct Derived : public Base {
T t;
};
int main() {
Base *b = new Derived;
delete b; // Boom!
std::unique_ptr<Base> b1 = std::make_unique<Derived>();
return 0;
}
Las clases base polimórficas deben declarar los destructores virtual
. Si una clase tiene alguna función virtual, debería tener un destructor virtual.
Para corregir el ejemplo, agregue lo siguiente:
struct Base {
virtual ~Base() = default;
}
Para compilar y probar este ejemplo, ejecute estos comandos en un símbolo del sistema para desarrolladores de Visual Studio 2019 versión 16.9 o posterior:
cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Error resultante
Consulte también
Introducción a AddressSanitizer
Problemas conocidos de AddressSanitizer
Referencia de lenguaje y compilación de AddressSanitizer
Referencia del entorno de ejecución addressSanitizer
Bytes de sombra addressSanitizer
Pruebas distribuidas o en la nube addressSanitizer
Integración del depurador AddressSanitizer
Ejemplos de errores addressSanitizer