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 virtual
derleyici çağrısı ~Base()
Base
oluşturur. çağırdığımızda delete b
nesnenin 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
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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin