我用MFC编程,写的程序都没错,但是在点击运行按钮之后运行的时候会出现这样的错误:
“Windows 已在 C45.exe 中触发一个断点。其原因可能是堆被损坏,这说明 C45.exe 中或它所加载的任何 DLL 中有 Bug。原因也可能是用户在 C45.exe 具有焦点时按下了 F12。输出窗口可能提供了更多诊断信息。”
奇怪的是有时候出现,有事不出现,像是着了魔一样,不知道是怎么回事?
如果关掉程序,重启之后,第一次一般可以运行,但之后又会间歇的出现如上问题,我在编写一个程序任务,这个问题纠结我好长时间了,网上找也没找到解决办法,希望在这里能遇到高人,指点迷津!MFC 触发一个断点 堆被损坏 有焦点时按下了 F12

解决方案 »

  1.   

    你要看点击运行按钮之后运行干了什么, 代码给出来啊。这是谷歌搜的:
    原因:
    程序中有类似以下的代码:
                                  CString str( "3" );
                                                        char *ptr = str.GetBuffer(0);
    而我在后面的代码中改变了ptr指针指向的内容,在"3"这个字符前加了19个空格,这样ptr指向内容的长度变成了20,超过了原字符串的长度。
    解析:
    由于当GetBuffer()函数中的参数取为0时,分配的空间是字符串所要的空间长度,以上两行代码,将会自动分配1。而在后面的操作中使字符串的长度超出了该范围,因此存在内存分配不足的问题,从而会出现“问题描述”中的错误提示[6]。只要把GetBuffer中的参数改成大于或等于20,就将不会再报错。
    这时在char *ptr = str.GetBuffer(20);的下一行应加一行str.ReleaseBuffer(); 因为“如果你使用由GetBuffer返回的指针来改变字符串的内容,你必须在使用其它的CString成员函数之前调用ReleaseBuffer函数。[2]”
    ReleaseBuffer函数是用来告诉CString对象,你的GetBuffer所引用的内存已经使用完毕,现在必须对它进行封口,否则 CString将不会知道它现在所包含的字符串的长度,所以在使用完GetBuffer之后,必须立即调用ReleaseBuffer函数重置 CString的内部属性,其实也就是头部信息[1]。你用谷歌搜一下吧。百度不好使