(नोट: इस सवाल का पूर्वप्रक्रमक hackery साथ आने के लिए इस दूसरे सवाल का जवाब देने को नो-सेशन आवंटन उत्पन्न करने के लिए कोशिश कर रहा से प्रेरित हुआ:क्या यह एक ही पते पर प्लेसमेंट के लिए अच्छी तरह से परिभाषित/कानूनी है?
... इसलिए सहन कि मन में)
class foo {
private:
int bar;
public:
foo(int bar) : bar (bar)
{ std::cout << "construct foo #" << bar << std::endl; }
~foo()
{ std::cout << "destruct foo #" << bar << std::endl; }
};
... जो मैं इस तरह आवंटित करेगा:
यहाँ एक काल्पनिक वर्ग है
// Note: for alignment, don't use char* buffer with new char[sizeof(foo)] !
void* buffer = operator new(sizeof(foo));
foo* p1 = new (buffer) foo(1);
foo* p2 = new (buffer) foo(2);
/* p1->~foo(); */ /* not necessary per spec and problematic in gen. case */
p2->~foo();
जीसीसी मैं चारों ओर मिल गया है, मैं "उम्मीद" परिणाम प्राप्त:
construct foo #1
construct foo #2
destruct foo #2
कौन महान है, लेकिन संकलक/क्रम एक दुरुपयोग के रूप में इस अस्वीकार और अभी भी हो सकता है कल्पना के दाहिने तरफ?
थ्रेडिंग के साथ कैसे? अगर हम वास्तव में इस वर्ग की सामग्री की परवाह नहीं करते हैं (मान लीजिए कि यह सिर्फ एक डमी ऑब्जेक्ट है) क्या कम से कम क्रैश नहीं होगा, जैसे कि सरल एप्लिकेशन में जो इसे पीओडी int के साथ प्रेरित करता है?
मुझे पूरा यकीन है (लेकिन संदर्भ नहीं हैं) कि यह गैर-पीओडी वस्तुओं के लिए कोशेर नहीं है। पीओडी के बारे में निश्चित नहीं है ... – bdonlan
मुझे लगता है कि आपका मतलब है "foo * p1 = new (buffer) foo (1);" –
आपका विनाशक वस्तु की स्थिति को नहीं बदलता है। अधिकांश विनाशक इस तरह नहीं हैं। –