C++注意的小细节 (二) 不要在vector内部数据上操纵vector
2011-02-02 18:45
316 查看
比如,我有一段代码如下:
这段代码,表面生没有什么问题。
当vct.push_back(cvi);时,当vct内部空间不足的时候,将会重新申请一段空间,这个对象就被移走了!
但是,注意,这个对象本来应该移走,但我们现在所在这个对象的内部的这个对象并么有移走,反而会变成垃圾,也就是在vct申请空间时,旧空间被析构,但逻辑上我们的对象仍然是垃圾对象,所以便悲剧了。
所以,以后再使用vct时一定要小心,小心被析构。
解决办法有两种:
(1)给定vector一定的空间,让其有足够的空间。
(2)这种设计模式本身就是有问题的,我们可以调整结构,比如在别处写一个函数do_it(int pos,vector<...> vct);
class cls_vector_item { private: vector<int> data; public: cls_vector_item(int a_data_num):data(a_data_num) { do_something(); } void do_it(vector<cls_vector_item>& vct) { for(int cnt=0;cnt<data.size();cnt++) { cls_vector_item cvi(10); vct.push_back(cvi); } } } int main(int argc,char**argv) { vector<cls_vector_item> vct(100); do_something()... for(int cnt=0;cnt<vct.size();cnt++) { vct[cnt].do_it(&vct); } }
这段代码,表面生没有什么问题。
当vct.push_back(cvi);时,当vct内部空间不足的时候,将会重新申请一段空间,这个对象就被移走了!
但是,注意,这个对象本来应该移走,但我们现在所在这个对象的内部的这个对象并么有移走,反而会变成垃圾,也就是在vct申请空间时,旧空间被析构,但逻辑上我们的对象仍然是垃圾对象,所以便悲剧了。
所以,以后再使用vct时一定要小心,小心被析构。
解决办法有两种:
(1)给定vector一定的空间,让其有足够的空间。
(2)这种设计模式本身就是有问题的,我们可以调整结构,比如在别处写一个函数do_it(int pos,vector<...> vct);
相关文章推荐
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- Effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- 读书笔记 effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- Effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- Effective c++ Item 28 不要返回指向对象内部数据(internals)的句柄(handles)
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果
- C++文本查询程序 不要定义类和智能指针管理数据 C++Primer练习12.28 使用vector,map,set容器保存来自文件的数据并生成查询结果