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
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