Partager via


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

Capture d’écran du débogueur affichant l’erreur new-delete-type-mismatch dans l’exemple 1.

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