2010-01-12 15 views
11

मेरे पास एक कस्टम आवंटक फ़ंक्शन है जो स्मृति प्राप्त करने के लिए sbrk() का उपयोग करता है। जब यह अब आवश्यक नहीं है, तो मैं इस स्मृति को कैसे रिलीज़ करूं?मैं sbrk() द्वारा प्राप्त स्मृति कैसे मुक्त करूं?

क्या मॉलोक() के लिए मुफ्त() के बराबर एक फ़ंक्शन है?

या क्या मुझे डेटा सेगमेंट के अंत को सेट करने के लिए ब्रैक() का उपयोग करना है?

उत्तर

20

आपको brk या sbrk को फिर से संक्षिप्त करने की आवश्यकता है।

अंत में एक ही तरीका है कि आप स्मृति (अलग syscalls तरह mmap से) की राशि को संशोधित करने के लिए है, को बढ़ाने या कम करने के लिए ढेर, ताकि आप इसे sbrk या brk साथ ऊपर ले जाएँ है और आप इसे नीचे ले जाने के brk साथ या नकारात्मक वृद्धि के साथ sbrk

+4

-1, आप 'sbrk' के साथ कम कर सकते हैं, बस इसे एक नकारात्मक मान पास करें। – avakar

+0

आप सही हैं, मैं इसे संपादित कर दूंगा। उस तरह से कभी भी sbrk इस्तेमाल नहीं किया, ठंडा। –

+0

ग्रेट, मैंने डाउनवोट हटा दिया है। – avakar

3

brk और sbrk का उपयोग न करें। यह जानना बेहद असंभव है कि कौन से लाइब्रेरी फ़ंक्शन malloc पर कॉल कर सकते हैं, और समय के साथ बदल सकते हैं, इसलिए यदि आपका प्रोग्राम अब काम करता है, तो यह तब भी टूट सकता है जब कोई libc अपग्रेड करता है। उन्हें बहुत अच्छे कारण के लिए पॉज़िक्स से बाहर रखा गया था।

+2

जिन्होंने कहा कि उनका आवंटन एकमात्र चीज नहीं है जो उसकी प्रक्रिया/आवेदन में ढेर से आवंटित करने के लिए उपयोग की जाती है? यह पूरी तरह से कानूनी हो सकता है। कृपया कुछ पूर्ण "क्या करें और न करें" जैसा कि आप हर मामले में हर किसी के लिए बेहतर जानते हैं, बस बताने से बचें। आपका स्पष्टीकरण सही है लेकिन यह भी कहता है कि आप गलत क्यों हैं (अगर वह मॉलोक का उपयोग नहीं करता है)। –

+2

@ v.oddou: वह कैसे जानता है कि 'printf' 'malloc' का उपयोग नहीं करता है? (कई वास्तविक प्रणालियों पर, यह करता है!) या कोई अन्य मानक पुस्तकालय समारोह? यह मेरे जवाब का पूरा बिंदु था। "मैं 'मॉलोक' का उपयोग नहीं करता हूं" उपयोग करने के लिए सुरक्षित होने के लिए 'brk' या' sbrk' के लिए पर्याप्त शर्त नहीं है। वास्तव में उनके लिए सुरक्षित होने के लिए कोई पर्याप्त शर्त नहीं है *। –

+0

बहुत अच्छा बिंदु। जो 'sbrk' के उपयोगकर्ताओं के लिए कुछ मध्यस्थता प्रदान करेगा। अब, क्या होगा यदि कोई भी किसी भी stdlib का उपयोग नहीं करता है? या बेहतर, एक कस्टम stdlib जो विशेष रूप से malloc का उपयोग नहीं करता है। या फिर भी, एक हुक रनटाइम जो किसी कस्टम फ़ंक्शन में कुछ आभासी प्रतीक तालिका पुनर्निर्देशन करके मॉलोक फ़ंक्शन को हैक करता है? –

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