您的位置:首页 > 编程语言 > C语言/C++

C++注意的小细节 (二) 不要在vector内部数据上操纵vector

2011-02-02 18:45 316 查看
比如,我有一段代码如下:

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐