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

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

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


1378903-486aae8e63a11dc1.png

更进一步地

1378903-b21a04a7a14816ca.png

解决过程
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暂时没有出现异常,这仍是需要研究的问题。。。

转载于:https://www.jianshu.com/p/7b2a33d11a1e

猜你喜欢

转载自blog.csdn.net/weixin_34355559/article/details/91101671