2014-08-31 25 views
6

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

cevap

4

Soru 1: Ben sorunu sabit olduğunu ayıklama hattını eklendiğinde Tam olarak ne oldu? Bazı nedenlerden dolayı operatörüm silme [] kendi uygulama kodumda çağrılana kadar bilinmiyordu? Bu sorunu çözmek için garantili mi yoksa sadece aptalca bir şans mı?

§3.2 [basic.def.odr]/P4:

bir satır içi işlevi ODR kullanılan olan her çeviri birimi tanımlanacaktır.

O ana çeviri biriminde kullanılan değil ve derleyici varsayabiliriz yani inline (işaretlenmiş beri derleyici küresel operator delete[] için kodu oluşturmak vermedi gibi geliyor

bu onları bir olacak kullanan herhangi çeviri birimi bunların tanımı). Ancak, ayrı olarak derlenmiş kitaplığınız bu işlevlerin bir tanımına sahip değildir ve standart kitaplıktaki varsayılanları kullanarak sonuçlanırsınız. Onları inline yapmamak sorunu çözmelidir.

Soru 2: Ben new (std::nothrow) D3D11_SUBRESOURCE_DATA[ mipCount * arraySize ] benim operator new[] doğrudan, ama sonunda denilen benim operator new (hayır parantez) aramadım fark ettim.İşaretçide hala operatör delete[]'u çağırır. bu sorun yaratır mı? operator new[] numaramın gibi uygun bir aşırı yüklenmesini mi yoksa bu davranış iyi mi?

atma ve operator new [] sürümlerini yanı sıra operator new ait nonthrowing sürümünü nonthrowing hem varsayılan versiyonları, hafızayı elde etmek operator new ait atma sürümünü çağırmak için belirtilmiştir. O yüzden orada güvendesin. Ancak, operator new 'un tanımları muhtemelen yanlıştır. Geçerli bir işaretçi döndürmeli veya bir istisna atmalıdırlar. Boş bir işaretçi döndürme izin verilmiyor.

+0

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

İlgili konular