आप सी में स्मार्ट संकेत नहीं कर सकते, क्योंकि यह आवश्यक वाक्य रचना प्रदान नहीं करता है, लेकिन आप अभ्यास के साथ लीक से बच सकते हैं। संसाधन आवंटन कोड को आवंटित करने के तुरंत बाद लिखें। इसलिए जब भी आप malloc
लिखते हैं, तो आपको तुरंत क्लीनअप अनुभाग में free
लिखना चाहिए।
int foo()
{
int *resource = malloc(1000);
int retVal = 0;
//...
if (time_to_exit())
{
retVal = 123;
goto cleanup;
}
cleanup:
free(resource);
return retVal;
}
सी में हम भी संदर्भों जो सामान का आवंटन का एक बहुत का उपयोग करें, एक ही नियम है कि के लिए भी लागू किया जा सकता:
int initializeStuff(Stuff *stuff)
{
stuff->resource = malloc(sizeof(Resource));
if (!stuff->resource)
{
return -1; ///< Fail.
}
return 0; ///< Success.
}
void cleanupStuff(Stuff *stuff)
{
free(stuff->resource);
}
सीआई में 'गोटो सफाई' पैटर्न एक बहुत देखते हैं
यह ऑब्जेक्ट कन्स्ट्रक्टर और विनाशकों के समान है। जब तक आप आवंटित संसाधनों को अन्य वस्तुओं को नहीं देते हैं, तब तक यह रिसाव नहीं होगा और पॉइंटर्स लटक नहीं पाएंगे।
ऐसा नहीं है कि आवंटन ट्रैक करता है और लीक ब्लॉक atexit
लिखते हैं एक कस्टम संभाजक लिखने के लिए मुश्किल नहीं है।
यदि आपको आवंटित संसाधनों को पॉइंटर्स देने की आवश्यकता है तो आप इसके लिए रैपर संदर्भ बना सकते हैं और प्रत्येक ऑब्जेक्ट संसाधन के बजाय एक रैपर संदर्भ का मालिक है। ये रैपर संसाधन और काउंटर ऑब्जेक्ट साझा करते हैं, जो उपयोग को ट्रैक करता है और ऑब्जेक्ट को मुक्त करता है जब कोई इसका उपयोग नहीं करता है। इस प्रकार सी ++ 11 के shared_ptr
और weak_ptr
काम करता है। यह यहां अधिक विस्तार से लिखा गया है: How does weak_ptr work?
यह कैसे काम करता है? यह पॉइंटर असाइनमेंट को कैसे ट्रैक कर सकता है? – Calmarius
@ कलमारेस वे काम करने के कई तरीके हैं। देखें: http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) –
मैं देखता हूं। मैंने आपके द्वारा लिंक किए गए जीसी के बारे में पूछा। यह दावा करता है कि यह केवल malloc और realloc को बदलकर, unmodified सी प्रोग्राम पर काम करता है। लेकिन यह आवंटित ब्लॉक को इंगित करने वाले पॉइंटर्स का पता कैसे लगाता है? उन्हें कार्यक्रम में चारों ओर कॉपी किया जा सकता है। – Calmarius