के साथ असफल होने के बाद सफल होता है मैंने ढेर आकार का अनुमान लगाने के लिए एक छोटा सा प्रोग्राम लिखा था (मुझे पता है कि शायद मैं इसे सिर्फ गुगल कर सकता हूं, लेकिन यह अधिक मजेदार लग रहा था और मैंने सोचा कि यह एक त्वरित सरल बात होगी)।मॉलोक कोई मुफ्त
इस पूरे कार्यक्रम है:
#include <stdio.h>
#include <stdlib.h>
void main()
{
unsigned long long alloc_size = 1024;
unsigned long long total = 0;
unsigned int i = 0;
void* p = 0;
while(alloc_size >= 16) {
p = malloc(alloc_size);
if (p) {
total += alloc_size;
i++;
printf("%u)\tAllocated %llu bytes\tTotal so far %llu\n", i, alloc_size, total);
alloc_size *= 2;
}
else {
alloc_size /= 2;
}
}
printf("Total alloctions: %llu bytes in %u allocations", total, i);
}
मैं इस भाग गया, और 2 बातें से आश्चर्यचकित था:
- परिणाम असंगत थी। यदि मैं इसे कई बार चलाता हूं, तो मुझे बिल्कुल वही परिणाम नहीं मिलता है। वर्चुअल मेमोरी मॉडल (या जिसे भी कहा जाता है) के लिए धन्यवाद, क्या यह निर्धारक नहीं होना चाहिए?
- चूंकि प्रोग्राम कभी भी स्मृति को मुक्त नहीं करता है, इसलिए मैं उम्मीद करता हूं कि यदि एक निश्चित आकार के लिए एक मॉलोक एक बार विफल हो जाता है, तो यह अचानक बाद में सफल नहीं होगा, लेकिन - आश्चर्य! यहां कार्यक्रम में से एक रन से एक नमूना, और कभी-कभी मैं अलग हो गया है (देखें # 1), लेकिन इसी तरह के परिणाम है:
42) Allocated 65536 bytes Total so far 28337044480
43) Allocated 16384 bytes Total so far 28337060864
44) Allocated 16384 bytes Total so far 28337077248
45) Allocated 16384 bytes Total so far 28337093632
46) Allocated 16384 bytes Total so far 28337110016
47) Allocated 32768 bytes Total so far 28337142784
48) Allocated 8192 bytes Total so far 28337150976
49) Allocated 8192 bytes Total so far 28337159168
50) Allocated 16384 bytes Total so far 28337175552
51) Allocated 32768 bytes Total so far 28337208320
52) Allocated 65536 bytes Total so far 28337273856
53) Allocated 131072 bytes Total so far 28337404928
54) Allocated 262144 bytes Total so far 28337667072
55) Allocated 16384 bytes Total so far 28337683456
56) Allocated 8192 bytes Total so far 28337691648
57) Allocated 4096 bytes Total so far 28337695744
आप देख सकते हैं, इस के बाद यह पहले से ही शिखर आवंटन पर पहुंच गया है आकार और इस तरह से नीचे है। आवंटन # 42 और # 43 के बीच, यह 32768 बाइट आवंटित करने की कोशिश करता और असफल रहा। आवंटन के बाद # 43 - # 45। तो अचानक यह # 47 पर कैसे प्रबंधित किया? आप एक ही चीज़ # 50 - # 54 पर देख सकते हैं। और यह केवल एक नमूना है। इस विशेष दौड़ में कुल 272 आवंटन में यह वही व्यवहार कई बार हुआ।
मुझे आशा है कि यह लंबे समय तक नहीं था, लेकिन मैं वास्तव में उलझन में हूं और इस पर किसी भी प्रकाश शेड के लिए खुश होगा।
संपादित
मुझे लगता है कि इस MinGW-W64 64 बिट जीसीसी संकलक के साथ एक Win7 64 बिट मशीन पर है जोड़ना चाहिए, कोई संकलक झंडे
'malloc()' विफल क्यों होगा? और कुछ अन्य प्रक्रियाओं के बाद "मुक्त 'डीडी मेमोरी के बाद यह सफल क्यों नहीं होगा? कृपया समझाओ * बिल्कुल वही परिणाम *? –
@iharob 'malloc' असफल हो जाएगा अगर यह आवश्यक मात्रा में स्मृति (स्मृति से बाहर) आवंटित नहीं कर सका। वर्चुअल मेमोरी मॉडल (यदि मैं इसे सही ढंग से समझता हूं) का अर्थ है कि मेरे प्रोग्राम मेमोरी आवंटन अन्य कार्यक्रमों से पूरी तरह से अलग हैं। – baruch
यह संभवतः आधुनिक ओएस पर काम नहीं करेगा ("आशावादी आवंटन" देखें)। भले ही, यह गारंटी नहीं देता है कि यह बाद में उपलब्ध होगा। बस जो भी आपको चाहिए उसे आवंटित करें और उपलब्ध न होने पर विफल हो जाएं। अपने ओएस को आउटमार्ट करने की कोशिश मत करो। – Olaf