MyMSDN

MyMSDN记录开发新知道

size_t的倒序遍历问题

准确地说还是经验不足,这么简单的事居然想了好几分钟,当然也要怪VS在没有重新生成前的诡异现象。

今晚在类中加入两个数组用来做计数,因为之前代码有所改动,VS编译(增量)的结果居然出现了无数次的程序崩溃,害我一度怀疑是不是我的数组写的有问题。囧。最后无奈之下,点了重新生成,居然顺利通过了,很生气,愤怒中。

但是另外却发现了一个问题,也就是当size_t用作循环的时候。因为以前都是用int做循环的,现在换成unsigned int(也就是size_t)后,一下子没反应过来,就顺手这么写了:

 

for( size_t i = MAX - 1; i >= 0; --i)

{

//……

}

乍一看似乎没啥问题,因为我循环内的代码是删除资源的,因此程序也频频崩溃。

step over的结果才让人惊讶,因为当size_t i = 0的时候,--i的结果是无穷大,而无穷大则肯定满足i>=0的条件,所以当我们期待程序停住的时候,程序是不会停住的。

修正的方式:

1、使用正向遍历。

2、增加判断条件(i>=0 && i < MAX),但这里也可能存在问题,因为size_t可能被定义为unsigned int,但是MAX可能是个更大的数,比如unsigned long long,当然这样的比较不是很有意义,或者会实现一些转换,但是如果这种情况发生的话,程序可能还是会通过一个随机的i进入到一个未知的空间中,从而造成崩溃。而且增加判断条件也使得程序的运行成本提高。

posted on 2010-06-30 23:51 volnet 阅读(1129) 评论(11)  编辑 收藏 引用 所属分类: C/C++

评论

# re: size_t的倒序遍历问题 2010-07-01 08:52 egmkang

换成int即可

我同事之前也犯过这个错误  回复  更多评论   

# re: size_t的倒序遍历问题 2010-07-01 09:16 volnet

@egmkang
我应该没发到首页去吧,你咋能看得到呢?  回复  更多评论   

# re: size_t的倒序遍历问题[未登录] 2010-07-01 13:30 Tiger

学习了,的确是在主页上看到的@volnet
  回复  更多评论   

# re: size_t的倒序遍历问题 2010-07-01 14:10 volnet

@Tiger
可是我怎么看不到呢?您能截图一下么,太奇怪了  回复  更多评论   

# re: size_t的倒序遍历问题 2010-07-01 17:33 OwnWaterloo

for (size_t i=n; i-- /*!=0*/; )
...  回复  更多评论   

# re: size_t的倒序遍历问题 2010-07-01 23:58 volnet

@OwnWaterloo
好像不错  回复  更多评论   

# re: size_t的倒序遍历问题 2010-07-07 09:13 egmkang

@volnet
牛人的,总归要订阅哈  回复  更多评论   

# shi 2010-08-23 16:34 uk dress

That's good  回复  更多评论   

# re: size_t的倒序遍历问题 2010-08-29 17:25 evening dresses

换成int即可
  回复  更多评论   

# re: size_t的倒序遍历问题 2010-08-29 17:30 evening dresses

题,因为size_t可能被定义为unsigned int,但是MAX可能是个更大的数,比如unsigned long long,当然这样的比较不是很有意义,或者会实现一些转换,但是如果这种情况发生的话,程序可能还是会通过一个随机  回复  更多评论   

# shi 2010-10-27 17:44 uk dress

good job  回复  更多评论   


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


特殊功能