2016-05-12 6 views
10

जब मैं malloc() एस और free() एस यादृच्छिक रूप से, नेस्टेड और विभिन्न आकारों के साथ उपयोग करता हूं, तो कुछ बिंदु पर स्मृति को खंडित किया जाएगा क्योंकि ये ऑपरेशन छोटे स्मृति क्षेत्रों की एक बड़ी सूची छोड़ते हैं जो गैर-संगत होते हैं और इसलिए ' टी एक बड़े टुकड़े के रूप में आवंटित किया जाएगा।मेमोरी विखंडन

इस पर कुछ सवाल:

  • जब ऐसा अक्सर इतना है कि स्मृति खंडित होने के लिए मजबूर किया जाता है किया जाता है और उसके बाद सभी इन स्मृति क्षेत्रों free() घ हैं मैं मान सकते हैं इन मुक्त क्षेत्र हैं अपने मूल, संगत आकार में वापस सम्मिलित?

  • जब मैं हमेशा एक malloc() एक ही स्मृति के लिए free() द्वारा पीछा किया है और कभी नहीं घोंसला इन कॉल करते हैं, स्मृति इस परिदृश्य में खंडित भी जब आवंटित/मुक्त कर दिया आकार हमेशा अलग हैं है?

+6

यह सब कार्यान्वयन निर्भर है। लेकिन, हाँ, एक अच्छा मेमोरी मैनेजर संगत मुक्त मेमोरी भागों को जोड़ देगा। और, हां, यदि आप 'मॉलोक' करते हैं तो उसके बाद 'फ्री' होता है और आप किसी भी लाइब्रेरी फ़ंक्शंस को कॉल नहीं करते हैं जो 'malloc' को बीच में कॉल करता है, तो कोई विखंडन नहीं होना चाहिए। –

+2

आप अपने प्रोग्राम http://www.valgrind.org के साथ वालग्रिंड चला सकते हैं और डेटा संरेखण त्रुटियों और मेमोरी लीक की जांच कर सकते हैं। –

+0

64 बिट एड्रेस स्पेस को खंडित करना काफी कठिन है। निश्चित रूप से, आप इसे उस बिंदु पर आसानी से विभाजित कर सकते हैं जहां आप अब 10 टीबी ऑब्जेक्ट आवंटित नहीं कर सकते हैं, लेकिन संभवतः आपके पास 10 टीबी रैम नहीं है। – MSalters

उत्तर

2

अनुसार आईएसओ/आईईसी 9899: 201x -> 7.22.3

आदेश और को लगातार कॉल aligned_alloc, calloc, malloc, और realloc कार्यों द्वारा आवंटित भंडारण की समीपता अनिर्दिष्ट है ।

एक अच्छा मेमोरी मैनेजर इस मुद्दे से कुछ हद तक निपटने में सक्षम होगा। हालांकि, डेटा संरेखण [1] जैसे अन्य पहलू हैं जो आंतरिक विखंडन का कारण बनते हैं।

यदि आप इनबिल्ट मेमोरी प्रबंधन पर भरोसा करते हैं तो आप क्या कर सकते हैं?

  1. एक प्रोफाइलर का प्रयोग करें - कहते हैं कि valgrind - स्मृति की जांच के विकल्प के साथ स्मृति जो उपयोग के बाद मुक्त नहीं है खोजने के लिए। उदाहरण:

    valgrind --leak-check=yes myprog arg1 arg2 
    
  2. अच्छी प्रथाओं का पालन करें।उदाहरण - सी ++ में, यदि आप दूसरों को अपनी पॉलिमॉर्फिक कक्षा से प्राप्त करने का इरादा रखते हैं, तो आप इसके विनाशक आभासी घोषित कर सकते हैं।

  3. स्मार्ट पॉइंटर्स का उपयोग करें।

नोट्स:

  1. Internal fragmentation

  2. यदि आप अपनी मेमोरी प्रबंधन प्रणाली का उपयोग करना चाहते हैं, तो आप Boehm-Demers-Weiser कचरा कलेक्टर पर विचार कर सकते हैं।

  3. Valgrind इंस्ट्रुमेंटेशन फ्रेमवर्क।

  4. उपयोग के बाद मुक्त नहीं स्मृति स्मृति विखंडन में योगदान देगा।
5

नहीं, कोई गारंटी नहीं है। N1570, 7.22.3 Memory management functions के अनुसार:

आदेश और को लगातार कॉल aligned_alloc, calloc, malloc, और realloc कार्यों द्वारा आवंटित भंडारण की समीपता अनिर्दिष्ट है।

  1. पूरी तरह से पुस्तकालय स्मृति प्रबंधन कार्यों पर भरोसा:

वैसे भी, आप से चुनने के लिए दो विकल्प हैं।

  • यदि आप वास्तव में आत्मविश्वास रखते हैं तो आप अपने मेमोरी मैनेजर लिखें।
  • यदि मैं आप थे, तो मैं निश्चित रूप से मौजूदा कार्यों पर भरोसा करता हूं, क्योंकि आधुनिक कार्यान्वयन सुपर स्मार्ट हैं।

    +0

    असल में, चूंकि प्रश्न भी है () टैग की गई सी ++, दो संभावनाएं पारस्परिक रूप से अनन्य नहीं हैं। आप वर्ग के आधार पर कक्षा में 'ऑपरेटर न्यू' ओवरराइड कर सकते हैं। – MSalters

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