2010-12-15 24 views
7

सी (या सी ++) में मैं सोच रहा हूं कि आंशिक रूप से स्मृति के ब्लॉक को डिलीकेट करना संभव है या नहीं।क्या आंशिक रूप से स्मृति को निष्क्रिय करना संभव है?

उदाहरण के लिए, हम आकार 100 की पूर्णांकों a की एक सरणी बनाने के लिए,

int * a = malloc(sizeof(int)*100); 

लगता है और फिर बाद में हम ऐसा a आकार बदलने के लिए है कि यह बजाय 20 ints 100

है रखती चाहते वहाँ a के केवल पिछले 80 * आकार (int) बाइट्स को मुक्त करने का एक तरीका? उदाहरण के लिए यदि हम रीयलोक को कॉल करते हैं, तो क्या यह स्वचालित रूप से ऐसा करेगा?

  • मैं ऐसे समाधान की तलाश में हूं जिसमें पहले 20 इंट्स को स्थानांतरित/कॉपी करने की आवश्यकता न हो।
  • वैकल्पिक रूप से, क्या आप समझा सकते हैं कि यह संभव क्यों होगा यदि यह संभव था, या ऐसा करने की क्षमता किसी भी भाषा में क्यों शामिल नहीं थी?

उत्तर

14

आप realloc का उपयोग कर सकते हैं, लेकिन आपको निश्चित रूप से स्मृति आवंटित करने के बजाय एसटीएल कंटेनरों का उपयोग करने पर विचार करना चाहिए।

+1

पुनर्विक्रय को सरणी की प्रतिलिपि नहीं करता है और फिर मूल को मुक्त करता है? – Cam

+4

@ कैम, नहीं। मौजूदा क्षेत्र को कम करने की अनुमति है (और अक्सर होगा)। –

+4

@ वाटसन 1180: ठीक है, लेकिन इसका अकेला मतलब कुछ भी नहीं है। सैद्धांतिक पुनर्विक्रय को ओ (एन!^99) समय लेने के लिए लागू किया जा सकता है और हमेशा आवश्यक स्मृति 500 ​​गुना आवंटित किया जा सकता है, लेकिन हम निश्चित रूप से कारक नहीं करते हैं कि रीयलोक से जुड़े निर्णय लेने में। – Cam

3

हम सी ++ में कच्चे पॉइंटर्स के लिए आरएआईआई कंटेनर पसंद करते हैं।

#include <vector> 

// ... 

{ 
    std::vector<int> a(100) 
    // ... 
    std::vector<int>(a.begin(), a.begin() + 20).swap(a); 
} 
+4

यह ध्यान दिया जाना चाहिए कि यह वास्तव में "आंशिक रूप से स्मृति को निष्क्रिय नहीं करता है।" यह वांछित आकार का एक नया ब्लॉक आवंटित करता है, मूल ब्लॉक से सामग्री की प्रतिलिपि बनाता है, और उसके बाद मूल ब्लॉक को मुक्त करता है। –

+1

'resize (20) 'के साथ क्या गलत है? (मैं एक सी ++ नोब हूं) – dreamlax

+1

आकार बदलें() आवंटित स्मृति को समायोजित करने की आवश्यकता नहीं है। यहां तक ​​कि स्पष्ट() भी नहीं है। –

2

मैं std::vector का उपयोग करना पसंद करूंगा। के सी सक्षम हैं ++ 0x:

void shrink_to_fit();

टिप्पणी:: shrink_to_fit एक गैर है

std::vector<int> vec(20); 
vec.reserve(100); 

// do something 

vec.shrink_to_fit(); 

n3092 से (नहीं तो अंतिम मसौदा, मैं इस पीसी पर ताज़ा प्रति प्राप्त करने की आवश्यकता) स्मृति उपयोग को कम करने के लिए बाध्यकारी अनुरोध। [नोट: अनुरोध कार्यान्वयन-विशिष्ट अनुकूलन के लिए अक्षांश की अनुमति देने के लिए गैर बाध्यकारी है। -जेंड नोट]

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