美文网首页
MFC学习笔记|error 0xC0000005 指针异常解决记

MFC学习笔记|error 0xC0000005 指针异常解决记

作者: KeyLiu7 | 来源:发表于2019-05-31 16:11 被阅读0次

    本文记录一个错误的解决过程和相关分析,如果你遇到了这个问题,请看分界线前的内容。后面代码内容仅供记录分析,代码内容仍有尚未解决的问题,也希望各位大神能够指点迷经,不胜感激。

    先说一下问题,在MFC程序每次退出时,都会触发一个异常。


    更进一步地

    解决过程
    0xC0000005可能出现的原因内存越界、野指针等,如果你遇到相关问题,从下面几个方面检查程序:

    • 1.数据越界或是定义的指针未释放.

    • 2.空的指针的可能性最大

    • 3.内存访问错误,检查指针,是否为空,是否越界等

    程序会中断在_CrtIsValidHeapPointer函数中,从CrtIsValidHeapPointer实现代码处我们可以得知,这个函数不仅检查了空指针的情况,更重要的是检查了指针地址的有效性,如果要释放的内存地址不是在当前控制的堆的地址范围内,也会报这样的错误。

    内存地址错误?而在程序编写中,使用了new/delete申请和释放内存,在执行中仍会出现错误。下面放出一段错误的代码。


    定义一个字符串并在构造函数中初始化。

    LPSTR MainStr;
    MainStr = new TCHAR(50);
    

    过程中会进行一些字符串操作,在析构函数中释放内存

    delete MainStr;
    

    [注]TCHAR 当我们定义了UNICODE宏,就相当于告诉了编译器:我准备采用UNICODE版本。这个时候,TCHARwchar_t。而未定义UNICODE宏时,TCHARunsigned char。这样就可以很好的切换宽窄字符集。

    其实代码发出来应该已经能够看出问题了,以数组形式定义一个字符串而并非类,相关程序应改为

    MainStr = new TCHAR[50];
    

    若是仅仅简单解决一个bug,这篇文章就不存在了。而实际上发现这个问题用了几天的时间,我们来看看程序中对这个字符串的其他操作。

    在程序中通过读取ini文件给MainStr赋值,ini文件内容为

    [MAINSTR]
    Title=Data Station - No. 1 Marchine
    

    读取ini文件并赋值给MainStr

    GetPrivateProfileStringA("MAINSTR","Title","",MainStr,50,lpPath);
    

    在初始遍编写程序时,并没有设置读取的size为50,而是20。程序没有出现异常。

    char()是一个转换为ASCII码字符的函数。char(50)即对应为'2'。因此在上述程序中是给MainStr赋了初值,其类型仍人char *故在执行过程中不会报错。

    但内存释放会有问题,会释放堆上的内存地址,然而在释放时并能不读取到内存地址。

    但为什么设置读取ini缓冲区长度为20暂时没有出现异常,这仍是需要研究的问题。。。

    相关文章

      网友评论

          本文标题:MFC学习笔记|error 0xC0000005 指针异常解决记

          本文链接:https://www.haomeiwen.com/subject/bmvnwqtx.html