2013-06-10 7 views
5

मुझे एक बड़े कार्यक्रम में मेमोरी लीक हो रही है और मेरा मानना ​​है कि यह इसका कारण है।चार सूचक संरचना स्ट्रक्चर सरणी मेमोरी लीक

#include <stdlib.h> 
#include <Windows.h> 

typedef struct _struct{ 
    char* name; 
} str; 

int main() { 
    system("PAUSE"); 

    str* Character = (str*)malloc(sizeof(str) * 20000); 

    for(int i = 0; i < 20000; i++){ 
     Character[i].name = (char*)malloc(20000); // Assign memory. 
    } 

    for(int i = 0; i < 20000; i++){ 
     free(Character[i].name);   // Free memory. 
    } 

    free(Character); 
    system("PAUSE"); 
} 

पहले विराम पर स्मृति: ~ 500K।

दूसरी रोक पर स्मृति: ~ 1.7 एम।

परीक्षण के लिए वीएस2012 का उपयोग करना। कोई विचार?

+1

आपका कोड सही दिखता है। आप स्मृति उपयोग को कैसे माप रहे हैं? क्या यह संभव है कि आपके ढेर प्रबंधक ने आपकी कॉल के बाद 'फ्री' पर अपनी ढेर को संपीड़ित नहीं किया है? इस मामले में, अतिरिक्त प्रक्रिया को आपकी प्रक्रिया में असाइन किया जाएगा लेकिन आपके प्रोग्राम द्वारा उपयोग में नहीं किया जाएगा, इसलिए वास्तव में आवंटित करने के लिए अन्य कोड के लिए उपलब्ध होगा। – simonc

+0

जब आप मॉलोक का उपयोग करते हैं, तो कृपया यह सुनिश्चित करना सुनिश्चित करें कि स्मृति वास्तव में आवंटित की गई है (कैरेक्टर == न्यूल) – hazzelnuttie

+0

आपको मॉलोक से रिटर्न कास्टिंग नहीं करना चाहिए। यह सी है और आप किसी भी चीज़ को शून्य * असाइन कर सकते हैं। –

उत्तर

4

आप प्रोग्राम द्वारा कब्जा कर लिया गया स्मृति की मात्रा को कैसे माप रहे हैं? मेरे सिर के ऊपर से एक चीज यह है कि आप ओएस को ट्रैक करने वाले सेटिंग के आकार को देख रहे हैं। चूंकि आपने बहुत सारी मेमोरी आवंटित की है और उसे मुक्त कर दिया है, इसलिए उस सेट का आकार बढ़ गया है। कुछ ओएस थोड़ी देर के बाद कामकाजी सेट के आकार को समायोजित करेंगे, कुछ नहीं करेंगे। हम यहां क्या ओएस देख रहे हैं?

+0

टास्क मैनेजर – Marc

+0

से विंडोज 7 अल्टीमेट और मेमोरी उपयोग मुझे यकीन नहीं है कि विंडोज क्या करता है (बाद में जांच करेगा, या कोई और भर सकता है), लेकिन संभवतया यह नहीं दिखाता कि आप क्या उम्मीद करते हैं। आधुनिक ऑपरेटिंग सिस्टम प्रसंस्करण पर सहेजने के लिए एक सकल और आलसी तरीके से प्रक्रिया मेमोरी का प्रबंधन करते हैं और पृष्ठों के विघटन में देरी कर सकते हैं। मॉलोक और फ्री का कार्यान्वयन भी स्मृति को आरक्षित कर सकता है। यदि आप वास्तव में सुनिश्चित करना चाहते हैं, तो लीक की जांच के लिए वाल्ग्रिंड जैसे टूल का उपयोग करें। – idoby

+0

मैंने इसे DrMemory के साथ अभी चलाया और 319 के साथ पहुंचने योग्य आवंटन के साथ संभावित लीक के 3 (1536 बाइट) पाए गए। – Marc

3

जब आप malloc पर कॉल करते हैं, तो ढेर पर स्मृति आवंटित की जाती है। यदि ढेर पर अपर्याप्त जगह छोड़ी गई है, तो कार्यक्रम ओएस से अधिक स्मृति के लिए पूछेगा और दूसरा हिस्सा हासिल होगा। ओएस से प्राप्त स्मृति आमतौर पर प्रोग्राम समाप्त होने तक वापस नहीं आती है (हालांकि यह ओएस तक है)।

अकेले प्रोग्राम आकार का उपयोग स्मृति लीक की जांच के लिए नहीं किया जा सकता है! स्मृति की जांच करने के लिए वालग्रिंड या एक समान टूल का उपयोग करें जो free डी कभी नहीं मिलता है।

-1

str * वर्ण = (str *) malloc (sizeof (str) * 20000);

उपर्युक्त पंक्ति में आप संरचना के आकार को ढूंढकर स्मृति आवंटित कर रहे हैं। यहां आपको जो संरचना मिलेगी उसका आकार सूचक चौड़ाई का आकार होगा, न कि चार का आकार।

उदाहरण के लिए मान लें कि सूचक चौड़ाई 32 बिट है, तो यह आवंटित (4 * 20000) = 80000 बाइट्स होगी।

आप 20000 struct के लिए आवंटित करने के लिए चाहते हैं,

str * चरित्र = (str *) malloc (sizeof (चार) * 20000);

+1

str * चरित्र structs की एक सरणी है, वर्ण नहीं (भ्रमित नाम मैं सहमत कर सकता हूं) तो आकार (str) सही है –

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