Sdílet prostřednictvím


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 bje 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

Snímek obrazovky ladicího programu s chybou neshody typu new-delete v příkladu 1

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