एसटीएल कंटेनर में मान मूल्य-दर-संग्रह द्वारा संग्रहीत किए जाते हैं। आप इस तरह से एक सदिश है:। एक वेक्टर के मामले में
class BigObject
{
...
};
vector<BigObject> myObjs;
myObjs.push_back(obj1);
myObjs.push_back(obj2);
...
वेक्टर वस्तु आप में धक्का कर रहे हैं की एक प्रतिलिपि बनाने जाएगा इसके अलावा, यह नई प्रतियां बाद में कर सकते हैं जब यह पुनः आवंटित करने के लिए है अंतर्निहित स्मृति, तो इसे ध्यान में रखें।
वही बात सच है जब आपके पास पॉइंटर्स का वेक्टर होता है, जैसे vector<char*>
- लेकिन यहां अंतर यह है कि प्रतियां जो प्रतियां हैं वह पॉइंटर है, न कि स्ट्रिंग जो इंगित करती है। तो यदि आपके पास है:
vector<char*> myStrings;
char* str = new char[256]; // suppose str points to mem location 0x1234 here
sprintf(str, "Hello, buffer");
myStrings.push_back(str);
delete [] str;
... वेक्टर को सूचक की एक प्रति प्राप्त होगी। पॉइंटर में यह वही मान (0x1234) होगा, और चूंकि आप पॉइंटर में धक्का देने के बाद पॉइंटर delete
डी करते हैं, इसलिए आपके वेक्टर में एक जंगली सूचक होता है और आपका कोड अंततः क्रैश हो जाएगा (उम्मीद से बाद में, उम्मीद है)।
कौन, वैसे, चार * रों आप तार का इस्तेमाल किया उपयोग करने के बजाय अगर बचा जा सकता था:
typedef vector<string> strings;
strings myStrings;
myStrings.push_back("Hello, buffer");
स्रोत
2010-02-02 21:09:38
स्पष्ट होने के लिए, कंटेनर तत्व टेम्पलेट तर्क प्रकार के मान की प्रतिलिपि बनाते हैं। यदि कंटेनर को "int *" रखने के लिए परिभाषित किया गया है, तो यह पॉइंटर्स को पूर्णांक में कॉपी करेगा, अंतर्निहित पूर्णांक नहीं। –