मैं एमएसवीसी 9.0 के साथ विंडोज 7 पर सी ++ का उपयोग कर रहा हूं, और एमएसवीसी 9.0 के साथ विंडोज एक्सपी एसपी 3 पर परीक्षण और पुन: उत्पन्न करने में भी सक्षम हूं।हटाई गई मेमोरी को पुन: उपयोग करने में असमर्थ क्यों है
यदि मैं उन्हें हटा देता हूं तो 1 जीबी 0.5 एमबी आकार की वस्तुओं को आवंटित करता हूं, सब कुछ ठीक है और अपेक्षित व्यवहार करता है। हालांकि अगर मैं उन्हें हटा देता हूं तो 1 जीबी 0.25 एमबी आकार की वस्तुओं को आवंटित करता हूं, तो स्मृति आरक्षित होती है (Address Space Monitor में पीला) और तब से केवल 0.25 एमबी से छोटे आवंटन के लिए उपयोग किया जा सकता है।
यह सरल कोड आपको दोनों परिदृश्यों का परीक्षण करके बताएगा कि कौन सी संरचना टाइप की गई है। इसके बाद structs आवंटित और हटा दिए जाने के बाद यह 1 जीबी 1 एमबी चार बफर आवंटित करेगा यह देखने के लिए कि क्या चार बफर एक बार कब्जे वाले सूत्रों का उपयोग करेंगे।
struct HalfMegStruct
{
HalfMegStruct():m_Next(0){}
/* return the number of objects needed to allocate one gig */
static int getIterations(){ return 2048; }
int m_Data[131071];
HalfMegStruct* m_Next;
};
struct QuarterMegStruct
{
QuarterMegStruct():m_Next(0){}
/* return the number of objects needed to allocate one gig */
static int getIterations(){ return 4096; }
int m_Data[65535];
QuarterMegStruct* m_Next;
};
// which struct to use
typedef QuarterMegStruct UseType;
int main()
{
UseType* first = new UseType;
UseType* current = first;
for (int i = 0; i < UseType::getIterations(); ++i)
current = current->m_Next = new UseType;
while (first->m_Next)
{
UseType* temp = first->m_Next;
delete first;
first = temp;
}
delete first;
for (unsigned int i = 0; i < 1024; ++i)
// one meg buffer, i'm aware this is a leak but its for illustrative purposes.
new char[ 1048576 ];
return 0;
}
नीचे आप Address Space Monitor के भीतर से अपने परिणाम देख सकते हैं। मुझे तनाव दें कि इन दो अंतिम परिणामों के बीच एकमात्र अंतर 1 जीबी मार्कर तक आवंटित किए गए structs का आकार है।
यह मेरे लिए काफी एक गंभीर समस्या है, और एक है कि कई लोगों से पीड़ित हो सकता है और यहां तक कि यह पता नहीं की तरह लगता है।
- तो क्या यह डिज़ाइन द्वारा है या इसे एक बग माना जाना चाहिए?
- क्या मैं छोटी आवंटित वस्तुओं को वास्तव में बड़े आवंटन के उपयोग के लिए मुक्त कर सकता हूं?
- और जिज्ञासा से अधिक, क्या मैक या लिनक्स मशीन एक ही समस्या से पीड़ित है?
आकार सीमा के अलावा, स्मृति विखंडन की तरह बदबू आ रही है। –
यह करता है, हालांकि स्मृति विखंडन तब होता है जब आवंटित वस्तुओं के बीच बर्बाद जगह होती है। उपर्युक्त कोड में, सब कुछ हटा दिया गया है, इसलिए स्मृति विखंडन मुद्दा नहीं हो सकता है। – 0xC0DEFACE
आप कहते हैं कि आरक्षित मेमोरी केवल 0.25 एमबी से कम आवंटित वस्तुओं के लिए उपयोग की जा सकती है। इसलिए, जब आप कई बड़ी ऑब्जेक्ट्स आवंटित करते हैं, तो क्या आपको स्मृति का अपवाद मिलता है जबकि यह स्मृति अभी भी आरक्षित है?मैं यह पूछता हूं क्योंकि, मैक ओएस पर, ऑपरेटिंग सिस्टम अप्रयुक्त मेमोरी को तेजी से पुनर्वितरण के लिए आरक्षित रखेगा, जब तक कि किसी अन्य प्रक्रिया को वास्तव में उस स्मृति की आवश्यकता न हो। –