Chyba: new-delete-type-mismatch
Chyba sanitizátoru adresy: Velikost přidělení se liší od velikosti přidělení
V tomto příkladu se volá pouze ~Base
, a ne ~Derived
. Kompilátor vygeneruje volání ~Base()
, protože Base
destruktor není virtual
. Při volání delete b
je destruktor objektu vázán na výchozí definici. Kód odstraní prázdnou základní třídu (nebo 1 bajt ve Windows). Chybějící virtual
klíčové slovo v deklaraci destruktoru je běžnou chybou jazyka C++ při použití dědičnosti.
Příklad – virtuální 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;
}
Polymorfní základní třídy by měly deklarovat virtual
destruktory. Pokud má třída nějaké virtuální funkce, měla by mít virtuální destruktor.
Pokud chcete tento příklad opravit, přidejte:
struct Base {
virtual ~Base() = default;
}
Pokud chcete tento příklad sestavit a otestovat, spusťte tyto příkazy v sadě Visual Studio 2019 verze 16.9 nebo novějším vývojářském příkazovém řádku:
cl example1.cpp /fsanitize=address /Zi
devenv /debugexe example1.exe
Výsledná chyba
Viz také
Přehled AddressSanitizer
Známé problémy s addressSanitizerem
Referenční dokumentace k sestavení a jazyku AddressSanitizer
Referenční informace k modulu runtime AddressSanitizer
Stínové bajty AddressSanitizer
AddressSanitizer – cloud nebo distribuované testování
Integrace ladicího programu AddressSanitizer
Příklady chyb AddressSanitizer