[C++][经验总结]vectory迭代器(iterator)失灵
[C++][经验总结]vectory迭代器(iterator)失效
在我们所熟悉的STL中,vector有自己的一套分配策略。
1)当vector被创建的时候,vector会根据用户的设置进行分配内存;通常申请的内存空间是制定值的两倍;
2)当vector插入数据的时候,如果内存空间不足,它会自动重新申请一块内存(2倍于当前大小),然后把原来的内存内容拷贝到新的内存中区,最后在释放原来的内存空间;
3)动态释放内存就导致一个问题的出现,那就是迭代器失效,因为vector已经偷偷的把地址给换了;
所以我们使用迭代器的原则是:
(1)尽量不做写的工作;
(2)不可避免使用写工作的时候,在做完写工作的同时必须重新初始化迭代器;
这部分是测试代码:
在我们所熟悉的STL中,vector有自己的一套分配策略。
1)当vector被创建的时候,vector会根据用户的设置进行分配内存;通常申请的内存空间是制定值的两倍;
2)当vector插入数据的时候,如果内存空间不足,它会自动重新申请一块内存(2倍于当前大小),然后把原来的内存内容拷贝到新的内存中区,最后在释放原来的内存空间;
3)动态释放内存就导致一个问题的出现,那就是迭代器失效,因为vector已经偷偷的把地址给换了;
所以我们使用迭代器的原则是:
(1)尽量不做写的工作;
(2)不可避免使用写工作的时候,在做完写工作的同时必须重新初始化迭代器;
这部分是测试代码:
typedef vector<string> NameVec; class TestForVector { public: TestForVector(unsigned int size = 5) :mSize(size>5 ? size:5) { mNameVec.reserve(size); OutPutVectorySize(string("TestForVector()")); } void insertFullItems() { string name("name"); char tmp[128]=""; OutPutVectorySize(string("insertFullItems()->begin")); for (unsigned int i = 0; i< mSize; i++) { name.clear(); _itoa(i+1, tmp, sizeof(tmp)); name.append("name "); name.append(tmp); mNameVec.push_back(name); } OutPutVectorySize(string("insertFullItems()<-end")); } void TestForInvalidVectorIterator() { NameVec::const_iterator itr = mNameVec.begin()+1;// point to the second element cout << "1)The address of itr is 0x"<< hex << &(*itr) << "context is: " << *itr << endl; OutPutVectorySize(string("TestForInvalidVectorIterator()->begin")); mNameVec.push_back(string("one more name")); OutPutVectorySize(string("TestForInvalidVectorIterator()<-end")); NameVec::const_iterator itr2 = mNameVec.begin()+1;// point to the second element cout << "2)The address of itr is 0x"<< hex << &(*itr2) << "context is: " << *itr2 << endl; //the memory of mNameVec has been re-allocated, so the context of itr has been removed //Crash cout << "3)The address of itr is 0x"<< hex << &(*itr) << "context is: " << *itr << endl; } private: void OutPutVectorySize(string funName) { cout<<"[TestForVector]:"<<funName.c_str()<<" mNameVec size = " << mNameVec.capacity() << endl; } private: NameVec mNameVec; unsigned int mSize; };