cyt
借助valgrind,终于找到一个隐藏很久的bug:
class A
{
    
}
;
std::vector
<A>  vecArray;

vecArray.push_back(  );
vecArray.push_back(  );
vecArray.push_back(  );

& a= vecArray.back();
vecArray.push_back(  );


以上的代码骤眼看上去也没有什么奇怪的地方,经过多次的测试也没有发现什么问题。但昨天bug终于爆发了,程序总是无缘无故down掉。
其实原因很简单,就是在 A & a = vecArray.back(); 这一步。
vector是一个会自增长的容器,自增长的结果就是把原来的内存释放掉,重新分配一个足够大的内存。既然原来的内存已经释放掉,那么a所引用的内存就是一段无效的内存。对无效内存的访问,后果有多严重就不用多说了。

想解决方法也很多,最简单就是用std::list或者std::deque替代vector。
posted on 2005-11-09 15:22 cyt 阅读(7914) 评论(8)  编辑 收藏 引用 所属分类: Work
Comments
  • # re: 使用std::vector的一个误区
    glacjay
    Posted @ 2005-11-09 22:06
    不可以保存索引吗?必须要用指针吗?为了效率?  回复  更多评论   
  • # re: 使用std::vector的一个误区
    cyt
    Posted @ 2005-11-10 09:23
    用索引是可以,不过个人不大喜欢用索引。其原因就是索引并不是stl容器所共有的特性,一旦使用了索引,以后如果需要转换为其他容器的时候,未免需要改动不少地方。另外,我这里所说的只是一种解决方法。对于我这种情况,只需要更改一个typedef定义就可以解决问题。如果改成是用索引的话,需要更改不少地方,而且很容易会漏了。
    程序本身算法也比较复杂,相对来说使用索引性能也不会下降多少,这个倒不是什么需要考虑的地方了。  回复  更多评论   
  • # re: 使用std::vector的一个误区
    nilaozi
    Posted @ 2005-11-11 22:23
    最后一次评论。也够出气了!

    一个在blogjava失去家园的人声讨。
    除了政治原因可以删了一个人blog,别的理由都不能成为理由。
    我为每个都到他们所需的ebook难道错了,
    贴到首页,我还以你们有预申机制,CSDN是这样,管理员认为可以才放到首页。
    不信你到他们的首页看看。
    http://csdn.blog.net/ahhoo
    如果你认为还不错的,请到回贴。
      回复  更多评论   
  • # re: 使用std::vector的一个误区
    blues
    Posted @ 2006-09-04 14:05
    vector和deque的差别是操作上的,list虽然是基于链表的,但是不能随机访问,任何的容器都不是完美的,而且使用指针必然要判断,但也算是个bug,
    我想解决的话类型用boost的any应该可以了,它本身带有安全检查,我没试仅是建议  回复  更多评论   
  • # re: 使用std::vector的一个误区
    stl
    Posted @ 2008-10-06 01:03
    STL里的容器大部分都是“值”容器,你用“引用”去访问容器里的内容,错了正常。这不是vector的问题,你自己使用的问题。如果基于性能考虑上面的程序一定要使用“引用”语意的话,应该用vector<A*>的写法才比较正确。  回复  更多评论   
  • # re: 使用std::vector的一个误区
    过客
    Posted @ 2008-11-04 08:42
    楼上的同志说的好,STL的容器最好使用指针,  回复  更多评论   
  • # re: 使用std::vector的一个误区[未登录]
    毛毛虫
    Posted @ 2011-08-20 21:40
    我也觉得应该vector<A*>比较好。  回复  更多评论   
  • # re: 使用std::vector的一个误区
    lancen
    Posted @ 2014-04-05 16:07
    很同意的你看法  回复  更多评论   

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理