Compartir a través de


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

Screenshot of debugger displaying new-delete-type-mismatch error in example 1.

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