首页
社区
课程
招聘
[讨论]内存溢出会出现的现象?
发表于: 2008-12-28 19:27 4042

[讨论]内存溢出会出现的现象?

2008-12-28 19:27
4042
子线程:
     char* pStr = new char [4];//分配内存空间,存储一个字符串

     memset (pStr, 0 , 4);         //内存空间初始化为0

     pStr = "123";                      // 字符串为123

     int iLen = strlen(pStr );      //字符串长度为iLen为3,

     SendMessage(hWnd, WM_XXXX, (WPARAM)pStr, (LPARAM)4);//发送到主界面

主线程WndProc:
    char buff[20];                                             //分配局部字符数组

    switch(wMessageID)
   {
        
         CASE: WM_XXXX
         {
             memcpy(buff, (char*)wParam, 20);  //注意这里是越界处理
                                                                     //正确的应该是
                                                             //memcpy(buff, (char*)wParam,(int)lParam);
            
              free((char*)wParam);                    //此处在DBG版本时报出异常,但是  //                                                                    在release版本下运行暂时无异常提示

              break;
         }
               
    }
虽然release版本下运行暂时没有出现问题,大家说说这个程序如果进行长时间运行会出现什么样的问题?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
有个笔误修正下,远程序中的free((char* wParam));是delete (char*)wParam;
2008-12-28 19:32
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没人说说吗?
2008-12-28 22:31
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
代码看上去是没问题的啊,你用OD调试时,异常代码是多少?是什么异常?

难道是因为线程本地堆的缘故?还是delete[]的原因?

对了,多线程的程序要设置连接器使用多线程的CRT库,不知道有没有关系?

用调试器跟踪一下异常发生点,把堆栈DUMP出来看看应该就会明白了。
2008-12-28 23:21
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
char* pStr = new char [4];//

在堆里面分配的,但是具体不知道在哪里,系统决定,如果刚好在一个堆结尾,那么memcpy(buff, (char*)wParam, 20);  就很可能读到下一页,而这一页是否允许访问,还未知。

至于free((char*)wParam);  如果你在free之前修改了这个指针所指的内容,比如将123,3后面的第四个字节的0改为非零了,那就很有可能会出错了。

你弄个简单的代码后调试下就看出来了。
2008-12-28 23:41
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
6
看一下这篇可能有帮助(也有讲到Debug模式之不同点)
http://www.codeguru.com/forum/showthread.php?t=312742
2008-12-28 23:52
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
这个程序在跑起来后,有时候出现0x0000 0005非法进入异常,错误点在new和delete那里,我在调试时发现,new和delete的参数全都是正确的。如果把delete那条语句去掉,则程序不出现异常。

我自己写了一个小程序。

main()
{
   
   char szChar[20]                           //分配局部空间

   while(true)
   {
           char* pStr = new char [4];//分配堆栈空间

          memset(pStr, 0, 4);            //堆栈空间初始化
   
            pStr = "123";                  

            memcpy(szChar, pStr, 20);//注意:这里是越界操作!!!

            cout << szChar << endl;   

            cout << pStr << endl;
           
            delete (char*)pStr;               //在debuger模式下,这里出现异常,在release模式下                                                //这里没有异常
   }

}

我用这个测试程序的release版本跑过半个小时,发现没有任何异常出现。但是这能说明
memcpy(szChar, pStr ,20)就正确吗?这句话在什么时候会引发异常呢?它有没有可能使得delete失败?从而导致下次的new出现异常呢?
2008-12-29 07:20
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
8
出了隐蔽的错误,要用调试器去查错,梁肇新先生的书里说,只有在汇编指令一级,才能确定真正的错误在哪里。

不要只对着源代码去“猜”,源码一级的错误经常是很隐蔽的,或者源码根本没错,而是编译器过库中存在BUG,要真正搞清错误的原因,只有自己用调试器去探查。

程序异常,这是非常典型的使用调试器查错的场合。找到了异常发生点,通过堆栈回溯,对出错的原因就有了个大概了解了。这正是调试技术派上用场的时候啊。
2008-12-29 10:47
0
游客
登录 | 注册 方可回帖
返回
//