आप ढेर पर एक संरचना का उपयोग कर सकते हैं। कि में निर्धारवादी विनाश है। आप इसे std.typecons.RefCounted का उपयोग करके भी refcounted किया जा सकता है। ढेर पर एक संरचना का उपयोग न करें, भले ही आप यह गारंटी देना चाहते हैं कि विनाशक चलता है। फिलहाल, मुझे नहीं लगता कि अगर वे ढेर पर रखे जाते हैं तो structs के विनाशक कभी भी दौड़ते हैं, क्योंकि जीसी में ऐसी जानकारी नहीं होती है जिसे इसे करने की ज़रूरत होती है (जिसे किसी बिंदु पर तय किया जाना चाहिए हालांकि भविष्य)।
लेकिन अगर आप एक कक्षा में ढेर पर यह में डाल पर जोर देते हैं, और आप स्पष्ट रूप से वस्तु को नष्ट करना चाहते हैं, तो आप clear
उस पर कॉल कर सकते हैं:
clear(obj);
कि वस्तु नाशक कॉल करेगा फिर इसे एक अमान्य स्थिति में रखें, और उसके बाद इसका उपयोग करने का प्रयास करने वाले किसी भी चीज को उड़ाया जाना चाहिए (आईआईआरसी, वर्चुअल टेबल शून्य हो जाती है)। लेकिन स्मृति वास्तव में मुक्त नहीं है। वह जीसी का काम है। और delete
का उपयोग न करें। इसे बहिष्कृत किया जा रहा है। मैं वास्तव में हैरान हूं कि यह अभी तक नहीं हुआ है, क्योंकि इसकी उम्र से बचने के लिए योजना बनाई गई है।
और निश्चित रूप से, एक विकल्प एक स्पष्ट कार्य है जिसे आप संसाधनों को जारी करने के लिए कहते हैं। चाहे यह एक अच्छा विचार है या नहीं, आप जो कर रहे हैं उस पर निर्भर करता है। लेकिन परवाह किए बिना, वर्गों को जीसी द्वारा एकत्रित करने का इरादा है और जब भी आप चुनते हैं उन्हें मुक्त नहीं किया जाता है।
कस्टम आवंटकों पर कार्य किया जा रहा है, जो आपको कक्षा को आवंटित करने के लिए और विकल्प प्रदान करेगा, और उनमें से एक शायद आपको कक्षाओं के अधिक निर्धारक विनाश की अनुमति देगा, लेकिन यह अभी तक तैयार नहीं है।
और अगर आप पागल महसूस कर रहे हैं, तो आप std.typecons.scoped है, जो शीघ्र ही हटा दिया करने के लिए प्रकार संशोधक scope
बदल देता है (हालांकि scope
अन्य संदर्भों में चारों ओर चिपके हुए है - जैसे scope
के रूप में बयान) का उपयोग कर सकते हैं। यह ढेर पर एक वर्ग रखता है।लेकिन यह असुरक्षित है (यही कारण है कि scope
इस संदर्भ में दूर जा रहा है), और यदि आप ऑब्जेक्ट को स्टैक पर चिपकाने जा रहे हैं तो शायद आप एक स्ट्रक्चर का उपयोग भी कर सकते हैं।
संपादित करें: तुम भी एक गैर जीसी आबंटित स्मृति का हिस्सा में वस्तु डाल करने के लिए की तरह आप C++ होगा malloc
और std.conv.emplace साथ free
इस्तेमाल कर सकते हैं, लेकिन मुझे लगता है कि आप स्पष्ट रूप से कॉल करने के लिए होगा कि इसे चलाने के लिए विनाशक, क्योंकि free
विनाशकों के बारे में नहीं समझता है (यह एक सी कार्य है)। उसमें संसाधन के साथ स्मृति को दूर करने का लाभ होगा (जबकि जीसी ढेर पर किसी ऑब्जेक्ट पर clear
का उपयोग करके ऑब्जेक्ट की सामग्री को नष्ट कर दिया जाएगा, स्मृति को मुक्त नहीं किया जाएगा), लेकिन मुझे नहीं पता कि यह आपको बहुत खरीदता है एक जीसी आवंटित वस्तु पर clear
का उपयोग करने पर।
लेकिन, आप तो new
के समान एक नि: शुल्क समारोह जो malloc
और emplace
आप के लिए करता है बना सकते हैं, और फिर delete
के समान एक नि: शुल्क समारोह जो नाशक और free
कहता है, जो आप सी के रूप में एक ही स्थिति देना होगा है ++ । वास्तव में, मुझे आश्चर्य है कि क्या यह मानक पुस्तकालय में इसे बनाने के लिए पर्याप्त उपयोगी होगा। शायद यह ऐसी चीज है जो कस्टम आवंटकों में समाप्त हो जाएगी। इसलिए, यह मुझे बिल्कुल भी आश्चर्य नहीं होगा अगर अपेक्षाकृत निकट भविष्य में, आप एक कस्टम संभाजक इस्तेमाल कर सकते हैं जैसे
auto obj = customAllocObj.create!MyObj(args);
//Do stuff...
customAllocObj.destroy(obj);
कुछ करने के लिए और मुझे लगता है कि है कि काफी अच्छी तरह से यह देखते हुए कि कि अनिवार्य रूप से है आपकी समस्या का समाधान होगा लगता होगा एक ही चीज जो आपके पास सी ++ में होगी, बस अंतर्निहित new
और delete
के बजाय लाइब्रेरी फ़ंक्शंस के साथ। मुझे लगता है कि मैं इसे न्यूज ग्रुप पर लाऊंगा। मैं उम्मीद करता हूं कि कम से कम कुछ लोग हैं जो ऐसी सुविधा चाहते हैं, और यह कस्टम आवंटकों के साथ अच्छी तरह फिट बैठता प्रतीत होता है।
व्यापक उत्तर के लिए धन्यवाद! मुझे यकीन नहीं है कि मैं ढेर पर एक संरचना का उपयोग कर सकता हूं क्योंकि मेरी वस्तुओं के जीवनकाल का जीवनकाल अधिक है। स्पष्ट मेरे लिए काम कर सकता है, लेकिन ऐसा लगता है कि यह मेरे अपने स्पष्ट() फ़ंक्शन से अलग नहीं है। Ypu ने मुझे किसी भी तरह के बारे में सोचने के लिए और अधिक चीज़ें दी हैं :) – jcoder
@ जॉन बी मैं मान रहा था कि आप शायद संरचना को पारित कर रहे हैं, लेकिन यह निश्चित रूप से सच है कि यह आपकी स्थिति के आधार पर काम नहीं कर सकता है। यदि आप अपना खुद का काम करते हैं, तो मैं सलाह दूंगा कि इसमें विनाशक न कहें - यह सिर्फ परेशानी के लिए पूछ रहा है (हालांकि विनाशक जो कुछ भी आपके कार्य को कॉल कर सकता है वह संसाधनों को मुक्त करता है)। इसलिए, यदि आप वास्तव में विनाशक को कॉल करना चाहते हैं, तो 'स्पष्ट' का उपयोग करें।यदि आप जो करना चाहते हैं, वह संसाधन मुक्त है, तो ऑब्जेक्ट को नष्ट करने के बजाय विशेष रूप से इसके लिए किसी अन्य फ़ंक्शन को कॉल करने के लिए और अधिक समझ हो सकती है। यह आपके कोड पर निर्भर करता है। –