Erreur : new-delete-type-mismatch
Erreur d’assainissement de l’adresse : taille de désallocation différente de la taille d’allocation
Dans cet exemple, seul ~Base
, et non ~Derived
, est appelé. Le compilateur génère un appel car ~Base()
le Base
destructeur n’est pas virtual
. Lorsque nous appelons delete b
, le destructeur de l’objet est lié à la définition par défaut. Le code supprime une classe de base vide (ou 1 octet sur Windows). Un mot clé manquant virtual
dans la déclaration de destructeur est une erreur C++ courante lors de l’utilisation de l’héritage.
Exemple : destructeur virtuel
// 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;
}
Les classes de base polymorphes doivent déclarer virtual
des destructeurs. Si une classe a des fonctions virtuelles, elle doit avoir un destructeur virtuel.
Pour corriger l’exemple, ajoutez :
struct Base {
virtual ~Base() = default;
}
Pour générer et tester cet exemple, exécutez ces commandes dans une invite de commandes développeur Visual Studio 2019 version 16.9 ou ultérieure :
cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Erreur résultante
Voir aussi
Vue d’ensemble de AddressSanitizer
Résoudre les problèmes connus liés à AddressSanitizer
Référence de build et de langage AddressSanitizer
Informations de référence sur le runtime AddressSanitizer
Octets d’ombre AddressSanitizer
Test cloud ou distribué AddressSanitizer
Intégration du débogueur AddressSanitizer
Exemples d’erreur AddressSanitizer