Condividi tramite


Errore: new-delete-type-mismatch

Errore di pulizia dell'indirizzo: dimensioni della deallocazione diverse dalle dimensioni di allocazione

In questo esempio viene chiamato solo ~Base, e non ~Derived, . Il compilatore genera una chiamata a ~Base() perché il Base distruttore non virtualè . Quando si chiama delete b, il distruttore dell'oggetto è associato alla definizione predefinita. Il codice elimina una classe base vuota (o 1 byte in Windows). Una parola chiave mancante virtual nella dichiarazione del distruttore è un errore C++ comune quando si usa l'ereditarietà.

Esempio - Distruttore virtuale

// 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;
}

Le classi di base polimorfiche devono dichiarare virtual distruttori. Se una classe ha funzioni virtuali, deve avere un distruttore virtuale.

Per correggere l'esempio, aggiungere:

struct Base {
  virtual ~Base() = default;
}

Per compilare e testare questo esempio, eseguire questi comandi in un prompt dei comandi per sviluppatori di Visual Studio 2019 versione 16.9 o successiva:

cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe

Errore risultante

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

Vedi anche

Panoramica di AddressSanitizer
Problemi noti di AddressSanitizer
Riferimento alla compilazione e al linguaggio AddressSanitizer
Informazioni di riferimento sul runtime AddressSanitizer
Byte ombreggiatura AddressSanitizer
AddressSanitizer cloud o test distribuiti
Integrazione del debugger AddressSanitizer
Esempi di errore addressSanitizer