2010-03-02 16 views
6

मेरा देव पर्यावरण VS2008, DX9, Windows XP है। मैं स्मृति मामले से बाहर सुरक्षा हैंडलिंग जोड़ने की कोशिश करता हूं। जब मॉलोक वापस लौटाता है, तो मैं डिस्क पर कुछ संसाधन पेज करता हूं, और स्मृति में संसाधनों को छोड़ देता हूं।क्यों मॉलोक हमेशा NULL

लेकिन कभी कभी, malloc हमेशा शून्य वापसी, भले ही मैं संसाधनों और प्रक्रिया स्मृति उपयोग के सबसे जारी करने और वी एम आकार केवल कार्य प्रबंधक में 800MB है।

मैं 88 बाइट्स आवंटित करने के लिए है, ठीक किया जाना चाहिए जहां प्रक्रिया स्मृति उपयोग केवल 800MB है malloc का उपयोग करने के बारे में सोचो। लेकिन मॉलोक हमेशा नल लौटता है।

क्या यह स्मृति विखंडन हो सकता है? ऐसा नहीं लगता है, क्योंकि प्रक्रिया मेमोरी उपयोग बहुत अधिक नहीं है।

alt text http://i.imagehost.org/0267/Snap2.jpg

+1

क्या आप हमें कुछ कोड दिखा सकते हैं? –

+0

एक्सई लॉन्च और वीएस डीबगर द्वारा जुड़ा हुआ था। – Buzz

+0

शून्य * AllocCRT (size_t आकार) { वापसी malloc (आकार); } मेम उपयोग: 644,088K वीएम आकार: 671,064K – Buzz

उत्तर

2

आप स्मृति विखंडन उल्लेख किया और कहा कि निश्चित रूप से मेरी पहली अनुमान होगा। this एप्लिकेशन डाउनलोड करने का प्रयास करें। इसे पता स्पेस मॉनिटर कहा जाता है, और यदि यह एक विखंडन मुद्दा है तो आपको यह दिखाने में सक्षम होना चाहिए।

+1

यह मॉनिटर विश्लेषण करेगा कि वह ओएस द्वारा देखी गई पता स्थान को संसाधित करता है, जबकि एमएसवीसी में 'malloc' विंडोज हीप एपीआई के माध्यम से काम करता है। यह सीधे सिस्टम से स्मृति आवंटित नहीं करता है और इसे सीधे सिस्टम पर वापस नहीं करता है। जिसका मतलब है कि यह मोनियर आपको कुछ भी दिखाने में सक्षम नहीं होगा। मॉनीटरों के लिए जैसे कि पूरे कार्यक्रम ढेर हमेशा के लिए आवंटित स्मृति के ठोस अभेद्य काले बॉक्स की तरह दिखेंगे। – AnT

+0

@AndreyT: मुझे लगता है कि 'आपको कुछ भी नहीं दिखाएगा' थोड़ा मजबूत है। प्रक्रिया ढेर उपयोगकर्ता पता स्थान का उपयोग करता है ताकि आप देख सकें कि यह कब समाप्त हो गया है; इसका जरूरी अर्थ यह नहीं है कि मॉलोक स्मृति को आवंटित करने में सक्षम नहीं होगा कि ढेर पहले ही आरक्षित है। ऐसा क्या होना चाहिए जब नि: शुल्क पता स्थान होता है कि ढेर का दावा करने में सक्षम होना चाहिए यदि उसे पहले से आरक्षित की तुलना में अधिक स्मृति आवंटित करने की आवश्यकता है। –

2

यह वर्चुअल एड्रेस स्पेस विखंडन हो सकता है। चेक करने का एक तरीका HeapCompact(GetProcessHeap(), 0) पर कॉल करना है। अगर वह पर्याप्त स्मृति को मुक्त करता है, तो यह संभावित कारण है।

एक और समान कारण डीबगर से लॉन्च होगा; जो विंडोज़ को डीबग ढेर का उपयोग करने का कारण बनता है, जिसकी वास्तव में लंबे समय तक वास्तव में खराब स्मृति व्यवहार होता है। उस व्यवहार को अक्षम करने के लिए, वातावरण में _NO_DEBUG_HEAP=1 सेट करें और चलाएं।

0

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

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