लोगों ने पहले ही बताया है कि यदि आप त्रुटि के मामले में अपने कोड से बाहर निकल रहे हैं (या निरस्त कर रहे हैं) तो शायद आपको स्मृति मुक्त करने की चिंता करने की आवश्यकता नहीं है। लेकिन सिर्फ मामले में, यहां एक पैटर्न है जिसे मैंने विकसित किया है और त्रुटि के मामले में संसाधन बनाने और निकालने के लिए बहुत कुछ उपयोग किया है।नोट: मैं एक बिंदु बनाने के लिए यहां एक पैटर्न दिखा रहा हूं, असली कोड नहीं लिख रहा हूं!
int foo_create(foo_t *foo_out) {
int res;
foo_t foo;
bar_t bar;
baz_t baz;
res = bar_create(&bar);
if (res != 0)
goto fail_bar;
res = baz_create(&baz);
if (res != 0)
goto fail_baz;
foo = malloc(sizeof(foo_s));
if (foo == NULL)
goto fail_alloc;
foo->bar = bar;
foo->baz = baz;
etc. etc. you get the idea
*foo_out = foo;
return 0; /* meaning OK */
/* tear down stuff */
fail_alloc:
baz_destroy(baz);
fail_baz:
bar_destroy(bar);
fail_bar:
return res; /* propagate error code */
}
मैं शर्त लगा सकता मैं कुछ टिप्पणी करते हुए कहा, "यह बुरा है, क्योंकि आप गोटो का उपयोग करें" प्राप्त करने के लिए जा रहा हूँ। लेकिन यह गोटो का एक अनुशासित और संरचित उपयोग है जो कोड को स्पष्ट, सरल और आसान बनाए रखने के लिए आसान बनाता है। आप इसके बिना कोड के माध्यम से एक सरल, प्रलेखित आंसू-नीचे पथ प्राप्त नहीं कर सकते हैं।
यदि आप इसे वास्तविक उपयोग में वाणिज्यिक कोड में देखना चाहते हैं, तो arena.c from the MPS (जो संयोग से स्मृति प्रबंधन प्रणाली है) पर एक नज़र डालें।
यह एक प्रकार का गरीब आदमी का प्रयास है ... हैंडलर खत्म करें, और आपको विनाशकों की तरह कुछ देता है।
मैं अब एक ग्रेबीर्ड की तरह लग रहा हूं, लेकिन अन्य लोगों के सी कोड पर काम करने के अपने कई वर्षों में, स्पष्ट त्रुटि पथों की कमी अक्सर एक गंभीर समस्या है, खासकर नेटवर्क कोड और अन्य अविश्वसनीय स्थितियों में। उन्हें पेश करने से कभी-कभी मुझे काफी परामर्श आय मिलती है।
आपके प्रश्न के बारे में कहने के लिए कई अन्य चीजें हैं - मैं इसे उपयोगी होने पर इस पैटर्न के साथ छोड़ने जा रहा हूं।
आप एटएक्सिट() फ़ंक्शन का भी उपयोग कर सकते हैं और लिंक किए गए सूची (जो इस मामले में वैश्विक चर होना चाहिए) पर आवंटित सभी मेमोरी को मुक्त करने के लिए एक फ़ंक्शन लिख सकते हैं - बाहर निकलने के लिए केवल एक सादा कॉल पर) - जिस तरह से आप सादा निकास() का उपयोग न करने के लिए याद रखना होगा। –
लेकिन क्यों? ऑपरेटिंग सिस्टम पहले ही आवंटित स्मृति की एक सूची बनाए रख रहा है। आप उस कार्यक्षमता को डुप्लिकेट कर रहे हैं, जो कि अहंकार मुद्रास्फीति के अलावा कुछ लाभ के बिना शट-डाउन प्रक्रिया को धीमा कर रहा है। जब तक आप एमएसडीओएस को अपना आवेदन पोर्ट करने की योजना नहीं बनाते, तो ओएस को अपना काम करने दें। – Eclipse
ऐसा क्यों है क्योंकि अंततः अनुशासन और funcitonality आपको स्मृति रिसाव को ट्रैक करने में मदद करेगा। यदि आप इसे सही तरीके से कोड करते हैं तो इसे डेफिन या मैक्रो परिभाषाओं के माध्यम से बंद कर दिया जा सकता है। – ojblass