导航

<2004年6月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

随笔分类

随笔档案

文章档案

相册

某年,某月,某日。
为某一个大型程序,增加一个大型功能。编译,运行,死机。

跟踪之,居然死在了如下语句:
CString str;
而且还极不稳定,这次调试死在n行,下次调试死在m行。但都是和内存申请有关。(由于程序很大,其中频繁地申请和释放内存,多处使用new和CString)

猜测:一定是内存不够啦,遂在某处调用函数得到当前剩余的物理内存数量并使用MessageBox显示。报告曰:自由物理内存还有100多M。鼠标按下OK键,程序居然不死了。恩???

删除MessageBox()函数---死!加上MessageBox()函数---不死!再删除--死,再加上--不死。晕倒!

捏呆呆郁闷不知道多少时间后,灵光闪烁......把多处的new/delete改写为GlobalAlloc()/GlobalFree(),一切OK。

事后原因分析:使用new和CString,频繁申请,释放内存,一定产生零碎内存块。当使用MessageBox的时候,系统接管程序的运行(因为它在等待着你按OK按纽),它这时候开始回收合并这些零碎的内存块。这样程序就没有问题了。而函数GlobalAlloc()/GlobalFree()本身就有回收合并零碎内存的功能。

友情提示:在频繁使用new,CString的场合,建议把某些(大)数据块的申请用GlobalAlloc替换。
友情求援:以上分析,不一定正确。需要new和GlobalAlloc源码分析才能作出正确判断。或那位朋友确切知道原因?

posted on 2004-06-26 17:01 杨老师的茅屋 阅读(2190) 评论(17)  编辑 收藏
评论
  • # re: 最痛苦的BUG之三,与大家共享
    周星星
    Posted @ 2004-06-27 02:25
    怀疑ing
  • # 同怀疑ing:P
    ksl
    Posted @ 2004-06-28 09:50
    同怀疑ing:P
  • # re: 最痛苦的BUG之三,与大家共享
    lonelystranger
    Posted @ 2004-06-28 17:16
    co-doubting
  • # re: 最痛苦的BUG之三,与大家共享
    tomblog
    Posted @ 2004-06-28 22:20
    我碰到过,但怀疑你的分析,
  • # re: 最痛苦的BUG之三,与大家共享
    xacjg
    Posted @ 2004-06-29 00:14
    我也碰到过类似的情形,也是加上AfxMessageBox就可以,去掉就死机,但出错的地方不是内存申请的情况。也不知为什么?
  • # re: 最痛苦的BUG之三,与大家共享
    zcjzch
    Posted @ 2004-07-10 14:52
    我觉得作者分析的很有道理,真应该多读读这样精辟的见解呵呵
  • # re: 最痛苦的BUG之三,与大家共享
    SwordLea
    Posted @ 2004-07-20 08:08
    应该是同步问题吧?
    但系统“本身就有回收合并零碎内存”这种说法还是很有创意的。
  • # re: 最痛苦的BUG之三,与大家共享
    阿坟
    Posted @ 2004-07-22 05:11
    怎么弄出这么多小的new呢,好好管理内存池吧
  • # re: 最痛苦的BUG之三,与大家共享
    阿冼
    Posted @ 2004-08-06 23:30
    唔~~ ,我在delphi中也遇到过这样的问题,几乎是一样~~

    频繁分配内存(动态数组) ,死~~!!

    而且死的地方都不一样~~!!
  • # re: 最痛苦的BUG之三,与大家共享
    笑容
    Posted @ 2004-12-06 08:46
    不知道那些编码近乎变态般标准的印度程序员和那些要求近乎苛刻的给日本做软件开发的大连工作的对日外包的程序员们,是否也会遇到这样的错误。。。
  • # 多线程很容易出现此类问题
    茹枫
    Posted @ 2005-01-16 10:45

    经常逐步调试时没问题,运行时出错。
    不知道那位大虾有解决问题的建议?
  • # re: 最痛苦的BUG之三,与大家共享
    Kenneth
    Posted @ 2005-02-01 13:09
    我在开发公司一个大型程序时也碰到了类似的问题,我开发的一个系统如果让它连续跑都没有问题,如果暂停后再开始跑,一跑就提示非法内存访问,这个问题困扰了我很多天,给我很大的压力啊,整个系统都成功了就差这最后一公里了。我发现我也有用new进行频繁内存分配的地方,明天我去改改,晚上给大家回复啊。
  • # re: 笑容
    as
    Posted @ 2005-04-22 14:10
     不知道那些编码近乎变态般标准的印度程序员和那些要求近乎苛刻的给日本做软件开发的大连工作的对日外包的程序员们,是否也会遇到这样的错误。。。

    SMWY,你了解“近乎变态般标准的印度程序员”和“要求近乎苛刻的给日本做软件开发的大连工作的对日外包的程序员”么?如果不了解,希望你别加那么多定语。

    什么,不知道什么叫定语?
  • # re: 最痛苦的BUG之三,与大家共享
    流水-
    Posted @ 2005-07-04 16:01
    前几天也遇到同样的问题!
    就是加上个AfxMessageBox()就没有事!
    当时就逛晕中。。。
  • # re: 最痛苦的BUG之三,与大家共享
    song
    Posted @ 2005-12-03 15:51
    有一次,我对COM232进行如下设置,结果突然出错:
    COMMTIMEOUTS TimeOuts;
    TimeOuts.ReadIntervalTimeout = MAXDWORD; 
    TimeOuts.ReadTotalTimeoutConstant = 0; 
    TimeOuts.ReadTotalTimeoutMultiplier = 0; 

    TimeOuts.WriteTotalTimeoutMultiplier = 0;//2; 
    TimeOuts.WriteTotalTimeoutConstant = 0;//5;
    SetCommTimeouts(m_hCom, &TimeOuts); // 设置超时

    无意中调换顺序改为:
    TimeOuts.ReadTotalTimeoutMultiplier = 0; TimeOuts.ReadTotalTimeoutConstant = 0; 
    一切OK.

    很痛苦,至今没明白原因
  • # re: 最痛苦的BUG之三,与大家共享
    song
    Posted @ 2005-12-03 15:55
    我在做一个多线程程序时,也碰到过类似问题.
    加一个MessageBox()或sleep()就好了.
  • # re: 最痛苦的BUG之三,与大家共享
    huang
    Posted @ 2005-12-25 19:38
    我也郁闷过,应该是同步问题
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]

统计