2011-01-03 27 views
7

मेरे पास कोड है, विभिन्न कारणों से, मैं सी रनटाइम से पोर्ट को विंडोज़ हीप एपीआई का उपयोग करने की कोशिश कर रहा हूं। मैं एक समस्या का सामना किया है: यदि मैं (संभाल के लिए GetProcessHeap के साथ) HeapAlloc/HeapReAlloc/HeapFree को malloc/calloc/realloc/free कॉल पुनर्निर्देशित, स्मृति सही ढंग से (कोई बुरा सूचक, लौटे आवंटित किया जा रहा है और कोई अपवाद नहीं फेंक दिया), लेकिन जिस लाइब्रेरी में मैं पोर्टिंग कर रहा हूं, वह किसी कारण से "स्मृति आवंटित करने में विफल" कहता है।क्या मॉलोक और हीपअलोक (पोर्टेबिलिटी से अलग) के बीच कोई मौलिक अंतर है?

मैंने माइक्रोसॉफ्ट सीआरटी (जो नीचे हीप एपीआई का उपयोग करता है) और दूसरी कंपनी की रन-टाइम लाइब्रेरी (जो नीचे ग्लोबल मेमोरी एपीआई का उपयोग करता है) के साथ यह कोशिश की है; उन दोनों के लिए मॉलोक लाइब्रेरी के साथ अच्छी तरह से काम करता है, लेकिन किसी कारण से, हीप एपीआई का उपयोग सीधे काम नहीं करता है।

मैंने जांच की है कि आवंटन बहुत बड़े नहीं हैं (> = 0x7FFF8 बाइट्स), और वे नहीं हैं।

एकमात्र समस्या जिसे मैं सोच सकता हूं स्मृति स्मृति संरेखण है; क्या यह मामला है? या इसके अलावा, क्या हेप एपीआई और सीआरटी मेमोरी एपीआई के बीच एक मौलिक अंतर है जिसे मुझे पता नहीं है?

यदि हां, तो यह क्या है? और यदि नहीं, तो स्थिर माइक्रोसॉफ्ट सीआरटी (विजुअल स्टूडियो के साथ शामिल) /calloc में HeapAlloc पर कॉल करने से पहले कुछ अतिरिक्त कदम क्यों उठाता है? मुझे संदेह है कि इसमें कोई फर्क पड़ता है लेकिन मैं नहीं सोच सकता कि यह क्या हो सकता है।

धन्यवाद!

उत्तर

3

जैसा कि मैंने मुश्किल तरीके से पता चला ...

अंतर मौलिक नहीं है, लेकिन HeapReAlloc (जो RtlReAllocateHeap उपयोग करता है) नहीं स्वचालित रूप से एक संकेत HeapAlloc कॉल करने के लिए के रूप में एक नल पॉइंटर का इलाज करता है, यह इसके बजाय विफल रहता है।

+1

हीपअलोक भी 0 आकार के पॉइंटर्स के लिए स्मृति आवंटित नहीं करेगा, जहां मॉलोक होगा। इसके अलावा, हीपअलोक मॉलोक को कॉल नहीं कर सका, क्योंकि यदि आप नए हैंडलर समस्या को सुधार नहीं सकते हैं तो आप परिपत्र कॉल का नेतृत्व कर सकते हैं – Necrolis

+0

ओह, मेरे पास एक टाइपो था; इसे ठीक किया, धन्यवाद। – Mehrdad