MFC学习笔记|error 0xC0000005 指针异常解决记
本文记录一个错误的解决过程和相关分析,如果你遇到了这个问题,请看分界线前的内容。后面代码内容仅供记录分析,代码内容仍有尚未解决的问题,也希望各位大神能够指点迷经,不胜感激。
先说一下问题,在MFC程序每次退出时,都会触发一个异常。
更进一步地
解决过程
0xC0000005可能出现的原因内存越界、野指针等,如果你遇到相关问题,从下面几个方面检查程序:
-
1.数据越界或是定义的指针未释放.
-
2.空的指针的可能性最大
-
3.内存访问错误,检查指针,是否为空,是否越界等
程序会中断在_CrtIsValidHeapPointer
函数中,从CrtIsValidHeapPointer
实现代码处我们可以得知,这个函数不仅检查了空指针的情况,更重要的是检查了指针地址的有效性,如果要释放的内存地址不是在当前控制的堆的地址范围内,也会报这样的错误。
内存地址错误?而在程序编写中,使用了new/delete
申请和释放内存,在执行中仍会出现错误。下面放出一段错误的代码。
定义一个字符串并在构造函数中初始化。
LPSTR MainStr;
MainStr = new TCHAR(50);
过程中会进行一些字符串操作,在析构函数中释放内存
delete MainStr;
[注]TCHAR
当我们定义了UNICODE
宏,就相当于告诉了编译器:我准备采用UNICODE
版本。这个时候,TCHAR
为wchar_t
。而未定义UNICODE
宏时,TCHAR
为unsigned 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暂时没有出现异常,这仍是需要研究的问题。。。