2012-05-11 10 views
10

यहां "सरल" से, मेरा मतलब गैर-वर्चुअल खाली विनाशक या पीओडी प्रकार वाला वर्ग है।क्या हमें "प्लेसमेंट न्यू" के साथ आवंटित "सरल पीओडी कक्षाओं" के लिए विनाशक को स्पष्ट रूप से कॉल करने की आवश्यकता है?

विशिष्ट उदाहरण:

char buffer[SIZE]; 
T *p = new(buffer) T; 
... 
p->~T(); // <---- always ? 

अगर हम p पर स्पष्ट नाशक फोन नहीं तो क्या होगा? मुझे नहीं लगता कि यह अपरिभाषित व्यवहार या स्मृति रिसाव है।
buffer का पुन: उपयोग करने में कोई समस्या है?

+0

@EdChum क्यों उल्लेख? वह उस बफर के शीर्ष पर एक ही वस्तु रख रहा है। – Benj

+0

@ बेन्ज माफ करना सिर्फ मेरी गलती को महसूस किया – EdChum

+1

प्लेसमेंट नया के साथ, क्या आप किसी भी उपप्रकार के विनाशक को कॉल करने के लिए भी जिम्मेदार हैं? – Benj

उत्तर

9

एक पीओडी-प्रकार या त्रिभुज विनाशक के साथ एक वर्ग के लिए: नहीं। ऑब्जेक्ट का जीवनकाल समाप्त हो जाएगा जब ऑब्जेक्ट के लिए संग्रहण जारी या पुन: उपयोग किया जाता है। यदि आप नहीं चाहते हैं तो आपको विनाशक को स्पष्ट रूप से कॉल करने की आवश्यकता नहीं है।

उस ने कहा, इसका कोई कारण नहीं है। एक छोटे से विनाशक के साथ एक प्रकार के लिए विनाशक कॉल कोई कोड उत्पन्न नहीं करेगा।

यदि, एक "खाली" विनाशक वाले वर्ग द्वारा आप इस संभावना को अनुमति दे रहे हैं कि कक्षा में गैर-तुच्छ विनाशकों के साथ सदस्य या आधार वर्ग हैं तो यदि आपका प्रोग्राम इन विनाशकों पर निर्भर करता है तो आपको अपरिभाषित व्यवहार मिल सकता है।

ध्यान दें कि एक उपयोगकर्ता प्रदान किया गया एक विनाशक एक गैर-तुच्छ विनाशक है भले ही यह गैर-आभासी है और खाली है। इसके बावजूद आपको अभी भी इस तरह के विनाशक के साथ किसी ऑब्जेक्ट के जीवनकाल को समाप्त करने की अनुमति है, जिससे आप अपने भंडारण को मुक्त या पुन: उपयोग कर सकते हैं बशर्ते कि आपका प्रोग्राम विनाशक के किसी भी दुष्प्रभाव पर निर्भर न हो। (आईएसओ/आईईसी 14882: 2011 के 3.8 [मूलभूत जीवन]/4 देखें)

+0

"यदि आपका प्रोग्राम इन विनाशकों पर निर्भर करता है तो आपको अपरिभाषित व्यवहार मिल सकता है ._" यह कथन समझ में नहीं आता है। आपको परिभाषित व्यवहार, आपके कोड का व्यवहार मिलता है। – curiousguy

+1

@curiousguy: यदि कोड में परिभाषित व्यवहार है, तो परिभाषा के अनुसार, यह ऐसे विनाशकों पर निर्भर नहीं हो सकता है। मुझे यकीन नहीं है कि मानक का यह हिस्सा गोलाकार रूप से "भरोसा" की परिभाषा पर संकेत देने के अलावा बहुत कुछ कहता है लेकिन मुझे नहीं लगता कि यह असंगत है। –

+0

"_ मुझे नहीं लगता कि यह असंगत है" नहीं। यह सिर्फ tautological है। आप यह भी कह सकते हैं कि कोड 'cout << "" की अपेक्षा करता है;' हैलो, वर्ल्ड 'प्रिंट करने के लिए अपरिभाषित है ... std में बहुत बेतुका बयान है, और यह मेरा पसंदीदा है। – curiousguy

12

तकनीकी रूप से बोलते हुए, यह मानते हुए कि विनाशक निर्माण के दौरान अधिग्रहित किसी भी संसाधन को जारी नहीं करता है, यह आवश्यक नहीं हो सकता है।

हालांकि, गैर तकनीकी पहलुओं पर विचार - कोड के रख-रखाव और विकास - मैं सबसे अच्छा अभ्यास करना चाहता हूं - जो बनाया गया था, उसे नष्ट किया जाना चाहिए। विचार करने के लिए परिदृश्य - क्या होगा यदि भविष्य में कुछ बदलाव विनाशक में प्रासंगिक कोड निर्धारित करेंगे? क्या आपको याद होगा कि आपने उस वस्तु के विनाश को प्रभावित किया है?

+2

का पालन नहीं करता हूं, मैं किसी भी दिन मूर्खतापूर्ण मानक उद्धरण पर सामान्य ज्ञान लेता हूं! – Pubby

+1

मुझे पसंद है 'मैं सबसे अच्छा अभ्यास' भाग लेना चाहता हूं। –

1

यदि आपकी कक्षा कुछ संसाधनों (ढेर मेमोरी, हैंडल, काउंटर, म्यूटेक्स ...) को संभालती है या संसाधनों को संभालने वाले कुछ फ़ील्ड हैं, तो यदि आप विनाशक को स्पष्ट रूप से कॉल नहीं करते हैं तो यह संसाधन मुक्त नहीं होंगे। अन्यथा विनाश के साथ कोई परेशानी नहीं है। आप स्मृति में कचरे के रूप में गैर-विनाशकारी वर्ग पर विचार कर सकते हैं और एक ही स्थान पर स्वतंत्र रूप से नए निर्माण कर सकते हैं।

+0

वह पीओडी प्रकारों के बारे में बात कर रहा है ... फिर वह एक म्यूटेक्स, काउंटर इत्यादि क्यों रखेगा। – celavek

+0

पीओडी में म्यूटेक्स को पॉइंटर या हैंडल हो सकता है जिसे ऑब्जेक्ट – inkooboo

+3

@inkooboo के निर्माण/आजीवन के दौरान अधिग्रहित किया जा सकता है: एक पीओडी में एक पॉइंटर हो सकता है लेकिन अगर हैंडल प्रकार पीओडी भी हो तो केवल एक हैंडल हो सकता है। म्यूटेक्स को पीओडी ऑब्जेक्ट के निर्माण के दौरान अधिग्रहित नहीं किया जा सकता है क्योंकि इसका मतलब यह होगा कि पीओडी में एक गैर-तुच्छ कन्स्ट्रक्टर था। –

0

हां, आपको स्पष्ट रूप से विनाशक को फोन करना होगा (कृपया टी के दुष्प्रभावों को ध्यान में रखें, यानी कुछ अतिरिक्त मेमोरी मुक्त करना)। साथ ही, आपको नियुक्ति नया उपयोग करते समय स्मृति संरेखण के बारे में सावधान रहना होगा।

यदि आप चाहें, तो आप बफर मेमोरी का पुन: उपयोग कर सकते हैं।

कृपया यह भी करने के लिए http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.14

+0

वास्तव में सवाल नहीं है, ओपी विशेष रूप से पीओडी के बारे में पूछ रहा है – Benj

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^