यदि यह एक बुरा विचार है, तो फ़ंक्शन में स्मृति आवंटित कैसे करें?क्यों एक समारोह में malloc स्मृति और बाहर इसे मुक्त एक बुरा विचार है?
उत्तर
यह "बुरा विचार" नहीं है, बल्कि "कभी-कभी एक बुरा विचार" है, जिसे प्रोग्रामिंग में कई विचारों के बारे में कहा जा सकता है।
फ़ंक्शन के अंदर मेमोरी आवंटित करना और इसे बाहर छोड़ना, एक सामान्य डिजाइन पैटर्न हो सकता है। पर विचार करें:
// hashtable is a typedef-ed pointer type
hashtable ht = hashtable_new();
// .. do something with hashtable
hashtable_free(ht);
ht
एक समारोह hashtable_new
में आवंटित करने और इसे बाहर जारी किया गया था, फिर भी आप अच्छी सी कोड के बहुत सारे में अधिक से अधिक इस पैटर्न देखेंगे।
यह दिखाता है कि, लॉजिकल यूनिट (हैश-टेबल एडीटी) आवंटन और डी-आवंटन का ख्याल रखता है। यह बहुत समझ में आता है - क्योंकि जो जानता है कि कैसे आवंटित किया जाए, जानता है कि कैसे डिलीकेट करना है। विभिन्न लॉजिकल इकाइयों में आवंटित और रिलीज अधिक बार एक बुरा विचार है।
किसी फ़ंक्शन में स्मृति आवंटित करना आवश्यक नहीं है। आपको बस इसे उचित तरीके से साफ करना होगा।
समस्या यह है कि जब आप फ़ंक्शन स्कोप छोड़ देते हैं तो आप ऐसा करने की क्षमता खो सकते हैं।
बस अपने डिज़ाइन से सावधान रहें। हर समय मुफ्त में मॉलोक से मिलान करें और आपके पास मेमोरी लीक नहीं होगा।
यह सवाल सबसे आसान अगर हम इसे रिवर्स जवाब देने के लिए है: कि एक ही समारोह में
- यह एक अच्छा विचार क्यों हो सकता है अगर हर वस्तु
malloc
'एक समारोह में d है भीfree
घ?
जवाब है, कोई मेमोरी लीक या झूलने संकेत हो जाएगा, और इस मूल्यवान परिणाम किसी अन्य समारोह के सहयोग के बिना हासिल की है। नतीजतन, कोड को सही करना आसान है, और फ़ंक्शन में एक साधारण इंटरफ़ेस है।
अब, यदि कोई फ़ंक्शन malloc
पर कॉल करता है लेकिन free
नहीं है? फिर इस बारे में नियम होना चाहिए कि स्मृति को मुक्त करने के लिए कौन बाध्य है, जब इसे करने की अनुमति है, और जब यह आवश्यक है। ये नियम फ़ंक्शन के इंटरफ़ेस का हिस्सा बन जाते हैं, और फ़ंक्शन को कॉल करने वाले किसी भी व्यक्ति को या तो यह सुनिश्चित करना चाहिए कि नियम या उसके बाद, या संभवतः पर कॉलर (ओं) पर समान नियम लागू करें। स्पष्ट स्मृति प्रबंधन इंटरफ़ेस को जटिलता जोड़ता है, और इंटरफ़ेस जितना अधिक जटिल होता है, उतना आसान है कि एक गलती करना जिससे स्मृति त्रुटि — और सी में हो, तो स्मृति त्रुटि आपके प्रोग्राम को क्रैश कर सकती है।
दुर्भाग्यवश, कभी-कभी यह आवश्यक एक ऑब्जेक्ट रखने के लिए है कि (ए) रन टाइम पर आवंटित किया जाना चाहिए और (बी) इसे आवंटित करने वाले फ़ंक्शन की सक्रियता को अव्यवस्थित करना चाहिए। ऐसे मामलों में, भले ही ऐसा लगता है कि यह एक बुरा विचार हो सकता है, हमारे पास आवंटन करने, इंटरफ़ेस को जटिल करने के लिए कोई विकल्प नहीं है, और ऑब्जेक्ट को सही तरीके से प्रबंधित करने के लिए कॉलर की आवश्यकता होती है।
(सरल मामलों में से एक जब एक वस्तु रन टाइम पर आवंटित किया जाता है है, लेकिन हमेशा के लिए जीना अनुमति दी है। लेकिन आप इस तरह की वस्तुओं की संख्या बाध्य करना होगा अन्यथा आप स्थान शेष नहीं होगा।)
यह बुरा विचार नहीं है अगर आप इसे अपनी शैली में लगातार रखते हैं।
एक अच्छा तरीका कॉलर को आवंटित स्मृति को पारित करना है जो इसे पूरा होने पर इसे मुक्त कर सकता है। कुछ इस तरह:
int my_new(char **obj) {
*obj = malloc(somesize);
}
और उसके बाद इस तरह अपने कार्य से इस फोन:
char *obj;
my_new(&obj);
/* work on obj */
free(obj)
संपादित करें: my_new()
वापसी int
बनाया है। डबल संकेत के लिए कोई ज़रूरत नहीं अन्यथा
निश्चित पैटर्न स्मृति का प्रबंधन करने
- समारोह के अंदर स्मृति को आबंटित, बाहर यह मुक्त जब यह कारण समय से अधिक जीवित
- जगह में सूचक धारण करने के लिए करने के लिए कर रहे हैं जब समारोह में मॉलोक संभवतः होता है, और इसे समाप्त होने के बाद इसे हटा दें, जैसा कि जोवे ने कहा था। दिमाग में स्थिरता नियम रखने के लिए, या अन्यथा यह आसानी से स्मृति रिसाव या लटकने वाले पॉइंटर्स का कारण बन जाएगा।
- 1. malloc स्मृति बाहर शून्यिंग? malloc स्मृति बाहर के शून्यीकरण
- 2. कॉलिंग malloc() और मुक्त() को रखना कितना बुरा है?
- 3. नई,, हटाने malloc और मुक्त
- 4. Apostrophe है। अच्छा विचार या बुरा विचार? और क्यों?
- 5. क्यों Process.killProcess (Process.myPid()) को कॉल करना एक बुरा विचार है?
- 6. Git धक्का: घातक: स्मृति से बाहर, malloc
- 7. * {स्थिति: सापेक्ष} एक बुरा विचार है?
- 8. क्यों सार्वजनिक ऑब्जेक्ट पर लॉक करना एक बुरा विचार है
- 9. अस्पष्टता के माध्यम से सुरक्षा एक बुरा विचार क्यों है?
- 10. ini_set ('max_execution_time', 0) एक बुरा विचार है?
- 11. एक pthread रिलीज malloced स्मृति से बाहर निकलता है?
- 12. कैच (अपवाद) लगभग हमेशा एक बुरा विचार क्यों है?
- 13. बेनामी क्लासेस एक बुरा विचार है?
- 14. मुक्त अंतरिक्ष malloc
- 15. नि: शुल्क आबंटित स्मृति से पहले एक समारोह
- 16. कैसे मुक्त() एक malloc() 'डी संरचित सही ढंग से?
- 17. स्मृति मुक्त करने का महत्व?
- 18. मुक्त एक डबल सूचक
- 19. जेएसओएन - एक बुरा या अच्छा विचार?
- 20. यूआरएल पथ में सिर्फ एक आईडी एसईओ के लिए एक बुरा विचार क्यों है?
- 21. malloc एक एम्बेडेड सिस्टम में
- 22. स्मृति matlab में मुक्त नहीं है?
- 23. वेब.config में डायनामिक डेटा को सहेजना क्यों बुरा विचार है?
- 24. लिंक, चुनिंदा है()। सिंगल डीफॉल्ट() एक बुरा विचार है?
- 25. घोंसला किया गया है एक बुरा विचार ब्लॉक/कैच ब्लॉक?
- 26. 'अगली' से एक बुरा विचार मान रहा है?
- 27. क्या अंतिम स्थिर विधि घोषित करना एक बुरा विचार है?
- 28. एक समारोह
- 29. क्या आरवीएम का सिस्टम-वाइड इंस्टॉलेशन एक बुरा विचार है?
- 30. : कार्य के बाहर एक स्टैक आवंटित संरचना क्यों मौजूद है?
यह आपके प्रश्न के लिए एक खिंचाव हो सकता है, लेकिन विचार समान है: अलग मेमोरी प्रबंधकों का उपयोग करके स्मृति आवंटित/मुक्त करना। उदाहरण के लिए, एक प्रोग्राम दो पुस्तकालयों का उपयोग करता है जो स्थिर रूप से सी रनटाइम को लिंक करते हैं। कार्यक्रम एक पुस्तकालय में एक वस्तु आवंटित करता है और इसे दूसरे में मुक्त करता है। ये गलत है। अगर कोई इसे बेहतर समझा सकता है, तो कृपया करें। – Ioan