2012-11-21 28 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; 
} 

आउटपुट (via ideone) के साथ ऑपरेटर को हटा दें:नई ओवरलोडिंग और वैकल्पिक तर्क

my new 1 

मेरे सोच सी ++ एक वस्तु new'd इसके मिलान के साथ अतिरिक्त तर्क के साथ मुक्त होता है कि एक ही तर्क का हटाना था, लेकिन मैं स्पष्ट रूप से गलत था।

मेरे अधिभारित डिलीट को कॉल करने के लिए ऊपर दिए गए कोड को पाने का सही तरीका क्या है?

+0

सी में कोई स्थान-हटाना अभिव्यक्ति नहीं है ++। आपको ऑब्जेक्ट को मैन्युअल रूप से नष्ट करने की आवश्यकता है। –

उत्तर

8

जब आप std::nothrow_t संस्करणों को छोड़कर, प्लेसमेंट के किसी भी रूप का उपयोग करते हैं, तो आपको ऑब्जेक्ट को स्पष्ट रूप से नष्ट करना होगा और जो भी आप फिट देखते हैं उसकी याददाश्त को छोड़ दें। operator delete() का ओवरलोडेड संस्करण अभी भी अस्तित्व में होना आवश्यक है, हालांकि, इसका उपयोग तब किया जाता है जब ऑब्जेक्ट का निर्माण अपवाद फेंकता है! इस मामले में, कोई सूचक वापस नहीं किया जाता है क्योंकि एक अपवाद फेंक दिया जाता है। मेमोरी से छुटकारा पाने के लिए, इस प्रकार आवंटन की इस प्रक्रिया में किया जाना है।

है, तो आप main() कुछ इस तरह दिखना चाहिए:

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