2012-11-21 23 views
7
#include <new> 
#include <cstdlib> 
#include <iostream> 
#include <stdexcept> 

struct foo {}; 

inline void* operator new(size_t size, foo*) throw (std::bad_alloc) 
{ 
    std::cout << "my new " << size << std::endl; 
    return malloc(size); 
} 

inline void operator delete(void* p, foo*) throw() 
{ 
    std::cout << "my delete" << std::endl; 
    free(p); 
} 

int main() 
{ 
    delete new((foo*)NULL) foo; 
} 

Çıkış (via ideone) operatöre silin:yeni aşırı ve opsiyonel argümanlar

my new 1 

Benim düşünce, C++ aynı argümanların silmek onun eşleşen ek argümanlarla bir nesne new'd özgür sağlamaktı ama açıkça yanlıştı.

Aşırı yüklenme silmek için yukarıdaki kodu almanın doğru yolu nedir?

+0

C hiçbir yerleşim silmek ifadesi yoktur ++. Nesneyi el ile yok etmeniz gerekiyor. –

cevap

8

std::nothrow_t sürümleri dışında herhangi bir yeni yerleşim kullandığınızda, nesneyi açıkça yok etmeli ve uygun gördüğünüz her şeyi kullanarak belleğini serbest bırakmanız gerekir. Bununla birlikte, operator delete()'un aşırı yüklenmiş sürümü hala mevcut olmak zorundadır, çünkü nesnenin yapısı bir istisna atarsa ​​kullanılır! Bu durumda, bir istisna atıldığı için hiçbir işaretçi döndürülmez. Hafızadan kurtulmak, bu şekilde, bu tahsis sürecinde gerçekleşecektir. olduğu

, sen main() bu gibi görünmelidir:

int main() 
{ 
    foo* p = new (static_cast<foo*>(0)) foo; 
    p->~foo(); 
    operator delete(p, static_cast<foo*>(0)); 
}