चलें कहते हैं कि मैं एक एसटीडी वेक्टर में डेटा प्राप्त करने के लिए एक समारोह है बिना std :: वेक्टर नष्ट:स्मृति
void getData(std::vector<int> &toBeFilled) {
// Push data into "toBeFilled"
}
अब मैं एक और समारोह के लिए इस डेटा भेजना चाहते हैं, कि डेटा समाप्त होने पर मुक्त कर देना चाहिए :
void useData(int* data)
{
// Do something with the data...
delete[] data;
}
दोनों कार्य (getData और useData) तय किए गए हैं और इन्हें बदला नहीं जा सकता है।
{
std::vector<int> data;
getData(data);
int *heapData = new int[data.size()];
memcpy(heapData, data.data(), data.size()*sizeof(int));
useData(heapData);
data.clear();
}
हालांकि, इस memcpy ऑपरेशन के बाद से डेटा ढेर पर पहले से ही है, महंगा है और वास्तव में आवश्यक नहीं है: जब डेटा एक बार को कॉपी यह ठीक काम करता है। क्या सीडी वेक्टर द्वारा आवंटित डेटा को सीधे निकालना और उपयोग करना संभव है? (स्यूडोकोड) की तरह कुछ:
{
std::vector<int> data;
getData(data);
useData(data.data());
data.clearNoDelete();
}
संपादित करें:
उदाहरण शायद बहुत ज्यादा मतलब नहीं है, क्योंकि यह संभव है बस useData को समारोह कॉल के बाद वेक्टर मुक्त करने के लिए। हालांकि, वास्तविक कोड में, useData नहीं एक समारोह लेकिन एक वर्ग है कि डेटा प्राप्त करता है, और इस वर्ग के वेक्टर से अधिक समय रहता है ...
मुझे डर है कि आप ऐसा नहीं कर सकते हैं। किसी भी तरह से वेक्टर को अपनी याददाश्त के बिना खाली किया जा सकता है ... – jpo38
यह किस तरह का पागल एपीआई है ?! सुनिश्चित करने के लिए –
@LightnessRacesinOrbit +1। और जनवरी, आपको पता नहीं है कि डेटा ढेर पर है। मानक केवल अनिवार्य है कि यह संगत और यादृच्छिक-पहुंच योग्य (और कुछ अन्य चीजें) है। 'Std :: string' की तरह, प्लेसमेंट-न्यू के लिए एक उचित छोटी वस्तु-स्थिर बफर के साथ एक छोटे-आइटम-गिनती वेक्टर के लिए यह अनदेखा नहीं किया जाएगा, जब पृष्ठ को बहुत छोटा माना जाता है तो पूरी तरह से गतिशील होता है। इस तरह के एक कार्यान्वयन आपके द्वारा उपयोग किए जाने वाले उपयोग के अनुपालन में * गंभीर रूप से * उड़ाएगा। – WhozCraig