C++'da operator new ve operator delete bellek ayırma ve serbest bırakma işlevleridir, bu işlevler new ve delete operatörleri ile nesne oluşturma ve silme sırasında çağrılır. Varsayılan olarak standart ayırıcıyı kullanır, ancak sınıfta bellek ayrımını ince bir şekilde kontrol etmek için aşırı yüklenebilir.
operator new "ham" bir bellek bloğu ayırır, bu işlemde yapıcı çağrılmaz.operator delete bellek serbest bırakma işlemini, nesnenin yıkıcısı tamamlandıktan sonra gerçekleştirir.operator new'yi aşırı yükleyerek, bu sınıf için nesnelerin bellek yönetimini optimize edebilirsiniz (örneğin, nesne havuzu, izleme, blokların yeniden kullanımı).\n#include <iostream> class TrackAlloc { public: void* operator new(size_t size) { std::cout << "TrackAlloc::new için " << size << " bayt "; return ::operator new(size); } void operator delete(void* ptr) { std::cout << "TrackAlloc::delete "; ::operator delete(ptr); } };
"Bir sınıfta operator new'yi aşırı yüklediyseniz, ardından bir türetilmiş sınıf değişkeni aracılığıyla bir nesne oluşturduğunuzda ne olur? Hangi operator new versiyonu çağrılacak?"
Cevap: Nesne oluşturulurken çağrılan sınıfın operator new'yi çağıracaktır. Eğer türetilmiş sınıfın operator new'si yoksa, uygun versiyonu bulmak için temel sınıfa veya küresel versiyona bakılacaktır.
Örnek:
struct Base { void* operator new(size_t s) { std::cout << "Base new "; return ::operator new(s); } }; struct Derived : Base {}; Derived* p = new Derived; // Base::operator new!'yi çağırır!
Hikaye
Geliştiriciler operator new/ delete'yi doğru sinyal işleme desteği olmadan aşırı yüklediler. Yapıcı içinde bir istisna atıldığında bellek serbest bırakılmadı, bu da bellek sızıntısına yol açtı.
Hikaye
operator new[] ve operator delete[] yanlış uygulandı: dizileri barındıran bir sınıf için yeni uygulama çağrılmadı — varsayılan versiyonlar kullanıldı, bu da bellek ayırma ve serbest bırakma mantığının senkronizasyonunu bozdu.
Hikaye
Küresel operator new'yi aşırı yüklemek üçüncü taraf kütüphanelerin çalışmasını etkiledi: tüm nesneler (geçici ve STL'den) kaydedilen ayırıcı ile ayrılmaya başlandı, bu da uygulamanın çekirdek performansını kritik şekilde yavaşlattı.