Daha hızlı ve hata ayıklama özellikleri için C++ bellek havuzları hakkında bilgi almaya çalışıyorum. Burada bulunan yaklaşımı takip ediyorum: http://oroboro.com/overloading-operator-new/.Genel aşırı yükleme sil [] üçüncü taraf kitaplıklarında çağrılmadı
inline void* operator new (size_t size) { return myAlloc(size); }
inline void* operator new[] (size_t size) { return myAlloc(size); }
inline void operator delete (void* ptr ) { myFree(ptr); }
inline void operator delete[](void* ptr ) { myFree(ptr); }
Üçüncü taraf kütüphaneleri new
bu sürümü yönlendirilmesini seviyorum ama bir sorunla karşılaştık: Ben böyle new
, new[]
, delete
ve delete[]
aşırı ettik. DXUT kullanan bir DirectX uygulama yapıyorum. DXUT'u projemden ayrı olarak derledim. Sonunda çağırır:
std::unique_ptr<D3D11_SUBRESOURCE_DATA[]> initData(new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ]);
bu eşsiz işaretçi kapsamı dışına gider sonra, benim aşırı operatör aracılığıyla gitmedi delete[] _Ptr
bir çağrı üzerine çöker. Ben main
benim int* dummy = new int[10]; delete[] dummy;
ekleyerek bellek havuzu uygulama hata ayıklama denedim. Projeyi oluşturmak bir hata verdi, ama temiz bina iyi çalıştı. Benim için sürpriz, her şey, çökmekte olan DXUT hattı da dahil olmak üzere çalıştı!
Soru 1: Sorunu gideren hata ayıklama satırını eklediğimde tam olarak ne oldu? Bazı nedenlerden dolayı operatör kodumu [] kendi uygulama kodumda arayana kadar bilinmedim mi? Bu sorunu çözmek için garanti edilir mi yoksa sadece aptalca bir şans mı?
Soru 2: new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ]
'un doğrudan operator new[]
numaralı telefonumu aramamış olduğunu, ancak en sonunda operator new
(köşeli parantezler) olarak adlandırdığımı fark ettim. İşaretçide hala operatör delete[]
'u çağırır. Bu bir sorun mu yaratıyor? operator new[]
numaramın çağrılması veya bu davranışın düzgün olması için uygun bir aşırı yük eklemem gerekir mi? Başvuru için
, denirdi operator new[]
aşırı oldu:
void * __CRTDECL operator new[](::size_t count, const std::nothrow_t& x)
_THROW0()
{ // Try to allocate count bytes for an array
return (operator new(count, x));
}
Satır içi kaldırma ve kodun yerine bir uygulama dosyasında yerleştirme başlığı çalıştı! Kopyaladığım bağlantının neden bunun hakkında hiçbir şey söylemediğini merak ediyorum. – DSM