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 fehlendes virtual
Schlüsselwort für die Destruktordeklaration ist ein allgemeiner C++-Fehler bei Verwendung der Vererbung.
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
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