Fehler: new-delete-type-mismatch

Bereinigungsfehler: Deallocation-Größe unterscheidet sich von der Zuordnungsgröße

In diesem Beispiel wird nur ~Base, und nicht ~Derived, aufgerufen. Der Compiler generiert einen Aufruf, ~Base() da der Base Destruktor nicht virtual. Wenn wir aufrufen delete b, wird der Destruktor des Objekts an die Standarddefinition gebunden. Der Code löscht eine leere Basisklasse (oder 1 Byte unter Windows). Ein fehlender virtual Schlüsselwort (keyword) für die Destruktordeklaration ist bei verwendung der Vererbung ein allgemeiner C++-Fehler.

Beispiel – virtueller Destruktor

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

Polymorphe Basisklassen sollten Destruktoren deklarieren virtual . Wenn eine Klasse über virtuelle Funktionen verfügt, sollte sie über einen virtuellen Destruktor verfügen.

Um das Beispiel zu beheben, fügen Sie Folgendes hinzu:

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

Führen Sie zum Erstellen und Testen dieses Beispiels die folgenden Befehle in einer Visual Studio 2019,16.9- oder höher-Entwickler-Eingabeaufforderung aus:

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

Resultierender Fehler

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

Siehe auch

AddressSanitizer -Übersicht
Beheben bekannter Probleme mit demSanitizer
AddressSanitizer Build- und Sprachreferenz
AddressSanitizer-Laufzeitreferenz
AddressSanitizer-Schattenbytes
AddressSanitizer-Cloud oder verteilte Tests
AddressSanitizer Debugger-Integration
Beispiele für AddressSanitizer-Fehler