Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Fehler:
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