2012-05-27 9 views
9

मैं पढ़ रहा हूँ आंद्रेई Alexandrescu के डी प्रोग्रामिंग भाषा और आंसू डाउन अनुक्रम में इस डला पाया:डी: गारंटी विनाश

... डी मानता बाहर निकलने आवेदन करेंगे वास्तविक इसके साथ जुड़े सभी संसाधनों को मुक्त करें, इसलिए यह किसी भी विनाशक का आह्वान नहीं करता है।

यह स्मृति संसाधनों के लिए बहुत अच्छा काम करता है, लेकिन नेटवर्क सॉकेट, कस्टम हार्डवेयर, फ़ाइल हैंडल इत्यादि जैसी चीजों के बारे में क्या है? क्या यह गारंटी देने का कोई तरीका है कि मेरा विनाशक हमेशा कहलाता है? वैकल्पिक रूप से: क्या डी इन चीजों को संभालने का एक बेहतर तरीका प्रदान करता है (और मैं सी ++ मानसिकता में फंस गया हूं)?

+0

** सी ++ ** में अनचाहे अपवादों के मामले में एक समान परिदृश्य है। –

+0

@ के-बॉलो: सही, लेकिन * सामान्य * आवेदन निकास के दौरान, मुझे यह गारंटी नहीं मिल रही है कि मेरी सभी वस्तुओं को नष्ट कर दिया जाएगा। यह काफी असुविधाजनक है। –

+0

@TravisGockel क्या आप पृष्ठ संख्या को शामिल करने के लिए प्रश्न संपादित कर सकते हैं? – Arlen

उत्तर

6

आप एक static destructor जो धागा समाप्ति पर बुलाया जाता है और shared static destructor जो (सामान्य) आवेदन शटडाउन होने पर कहा जाता हो जाता है का उपयोग कर सकते

(अब केवल अगर हम कमजोर संदर्भ था तो हम अविवेक के एक अन्य स्तर पर की जरूरत नहीं होगी। ..)

3

अन्य ने मॉड्यूल स्तर के विनाशकों का उल्लेख किया है, लेकिन यह वास्तव में व्यावहारिक नहीं है क्योंकि इसे बहुत अधिक मैन्युअल रखरखाव की आवश्यकता है, और डी में एक परेशान क्विर्क स्थिर रचनाकारों/विनाशकों के साथ मॉड्यूल थे, चक्रीय आयात नहीं हो सकते हैं। उदाहरण के लिए:

मॉड्यूल एक

module A; 
import B; 
static ~this() {} 
void main() {} 

मॉड्यूल बी को चलाने के लिए

module B; 
import A; 
static ~this() {} 

प्रयास करें ...

% dmd A.d B.d 
% ./A 
Cycle detected between modules with ctors/dtors: 
A -> B -> A 
[email protected]/rt/minfo.d(331): Aborting! 

डी करता है बस अगर आपके विनाशक एक-दूसरे पर निर्भर होते हैं, तब भी जब वे नहीं करते हैं। यह आपको इस गैर-समस्या के आसपास काम करने के लिए अपने कोड के अजीब "रिफैक्टरिंग" करने के लिए मजबूर करता है। डी को बताने का कोई तरीका नहीं है कि वास्तव में निर्भरता नहीं है।

संसाधन विनाश को संभालने का एक बेहतर समाधान जितना संभव हो सके कोशिश करना और गुंजाइश करना है। ऐसे वैश्विक संसाधन नहीं हैं जिनके लिए विनाश की आवश्यकता है, और किसी भी चीज़ के लिए क्लास फ़ाइनलाइजर्स पर भरोसा न करें, क्योंकि कभी भी (जावा में एक ही समस्या है) चलाने की गारंटी नहीं है।

वैकल्पिक रूप से, बस सी में किए गए काम करें: मैन्युअल शटडाउन। यह थोड़ा और काम है, लेकिन वास्तव में एक बड़ी समस्या नहीं है। चक्रीय आयात के साथ कुश्ती से यह निश्चित रूप से आसान है।

0
  • प्रक्रियाओं को मारना प्रक्रिया में आंतरिक सबकुछ साफ करता है।
  • ओएस को प्रक्रिया से बाहर की चीजों को साफ करने के लिए समय होने से पहले प्रक्रिया को मारने से रोकने का कोई तरीका नहीं है (और यदि वहां था, तो बिजली का नुकसान भी उस पर ओवरराइड होगा)।

उनमें से दो के बीच, सबकुछ ढंका हुआ है, इसलिए यह मानने के बजाय आप चीजों को बंद करने में कहने के बजाय व्यर्थ हैं।

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