注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Hao的博客

I'm on my way……

 
 
 

日志

 
 
 
 

CString引发HEAP CORRUPTION  

2009-04-05 11:49:01|  分类: 编程杂记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

今天照着VC++项目开发全程实录中的代码,在自己的VS2008上面实践了一下,结果就出问题了。代码如下:

BOOL CLogin::PreTranslateMessage(MSG* pMsg){
     if(pMsg->message==WM_KEYDOWN && pMsg->wParam==VK_RETURN){
         CString str;
        GetClassName(pMsg->hwnd,str.GetBuffer(0),MAX_PATH);
        if(str=="Edit")
        pMsg->wParam=VK_TAB;
    }

     return CDialog::PreTranslateMessage(pMsg);

}

这只是部分的代码,实现的功能是在特定的情况下让回车键完成TAB的功能(如输入用户名后输密码)。

但是在实际运行时,当在特定的地方按下回车键后,就跳出了下面的提示框:

CString引发HEAP CORRUPTION - chhaj5236 - chhaj5236的博客

      大致的意思就是说内存溢出。在网上搜了好久,大多都是说动态分配时不恰当的delete引起的,我盯着代码看了好久都没发现哪里用了delete,或是应该用delete,看样子不是这个问题了。还有另一种说法,就是当输入超过了预分配的空间大小时,就会覆盖掉该空间后面的一段存储区,也会引发heap corruption的问题。

      经过不断的检查,最后将问题定位在GetClassName一行,能在这一行出问题的大概也就只有str.GetBuffer()这个函数了。可是默认参数下不是表示由系统计算字符串的长度吗,怎么会出现那样的错误呢。在看雪学院的一个主题中,我似乎找到了我想要的答案。GetBuffer默认参数虽然由系统决定字符串的长度,但是必须是标准的含'\0'的字符串,否则就得自己给出长度。如果由GetBuffer所得到的字串指针修改了CString,那么必须调用ReleaseBuffer()来重新计算字串的长度,否则会出错,或者结果不正确!

    这么说的话在这个实例下由GetClassName所得到的类名不是标准的字符串了,我试着将GetBuffer的参数改成了10,错误就不见了。种种迹象表明问题确实出在此,但是由于我是初学的人,也就只能根据这些现象去确定问题了,如果以后发现还有其他的问题的话再回来改改吧。

  评论这张
 
阅读(393)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017