Aracılığıyla paylaş


Hata: new-delete-type-mismatch

Adres Temizleme Hatası: Ayırma boyutundan farklı serbest bırakma boyutu

Bu örnekte, yalnızca ~Base, değil ~Derivedçağrılır. Yok edici olmadığından virtualderleyici çağrısı ~Base()Base oluşturur. çağırdığımızda delete bnesnenin yıkıcısı varsayılan tanıma bağlıdır. Kod boş bir temel sınıfı (veya Windows'da 1 bayt) siler. Yıkıcı bildiriminde eksik virtual bir anahtar sözcük, devralma kullanılırken sık karşılaşılan bir C++ hatasıdır.

Örnek - sanal yıkıcı

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

Çok biçimli temel sınıflar yıkıcılar bildirmelidir virtual . Bir sınıfın herhangi bir sanal işlevi varsa, bir sanal yıkıcısı olmalıdır.

Örneği düzeltmek için şunları ekleyin:

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

Bu örneği derlemek ve test etmek için visual studio 2019 sürüm 16.9 veya sonraki bir geliştirici komut isteminde şu komutları çalıştırın:

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

Sonuçta oluşan hata

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

Ayrıca bkz.

AddressSanitizer'a genel bakış
AddressSanitizer bilinen sorunları
AddressSanitizer derlemesi ve dil başvurusu
AddressSanitizer çalışma zamanı başvurusu
AddressSanitizer gölge baytları
AddressSanitizer bulut veya dağıtılmış test
AddressSanitizer hata ayıklayıcısı tümleştirmesi
AddressSanitizer hata örnekleri