woaidongmao

文章均收录自他人博客,但不喜标题前加-[转贴],因其丑陋,见谅!~
随笔 - 1469, 文章 - 0, 评论 - 661, 引用 - 0
数据加载中……

使用std::vector的一个误区

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

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

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


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

想解决方法也很多,最简单就是用std::list或者std::deque替代vector。
 
========================================================================================
 

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*>的写法才比较正确。  回复 更多评论

posted on 2008-10-16 13:28 肥仔 阅读(778) 评论(0)  编辑 收藏 引用 所属分类: Boost & STL


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