cyt
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2006年9月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
统计
随笔 - 36
文章 - 0
评论 - 87
引用 - 0
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(12)
给我留言
查看公开留言
查看私人留言
随笔分类
Work(20)
(rss)
随笔档案
2008年1月 (1)
2007年9月 (1)
2007年3月 (3)
2006年11月 (2)
2006年4月 (2)
2006年3月 (2)
2006年1月 (3)
2005年11月 (2)
2005年10月 (20)
文章分类
C/C++
(rss)
Libraries
(rss)
好友Blog
hongrui
Rayman
(rss)
Turing
废人废语
(rss)
搜索
最新评论
1. re: OCI访问Oracle的一些刁钻问题[未登录]
这个有没有具体的代码?目前正好遇上这个问题了
--paul
2. re: 使用std::vector的一个误区
很同意的你看法
--lancen
3. re: 新版本的Qu
评论内容较长,点击标题查看
--home page
4. re: 新版本的Qu
评论内容较长,点击标题查看
--Web site
5. re: 新版本的Qu
评论内容较长,点击标题查看
--this link
阅读排行榜
1. 使用std::vector的一个误区(7909)
2. epoll的安装和调试(5813)
3. 我自己的signal / slot实现(5390)
4. 如何在windows service里面控制console程序退出(4520)
5. OCI访问Oracle的一些刁钻问题(4450)
评论排行榜
1. 新版本的Qu(19)
2. 使用std::vector的一个误区(8)
3. C++博客的精华区分类构想(意见收集)(8)
4. drupal安装心得(7)
5. 补充 BVRDE 使用的一些注意问题(6)
使用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。
posted on 2005-11-09 15:22
cyt
阅读(7909)
评论(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
很同意的你看法
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
如何在windows service里面控制console程序退出
补充一个OCI的问题
OpenDBX 一个访问多数据库的C类库
移植代码到64bits碰上的问题
db4o and GigaBase
实在惭愧
新版本的Qu
OCI访问Oracle的一些刁钻问题
Linux的系统性能监测参数获取
简单的类型安全format输出后记
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理