FreeMem()后调用ShowMessage()触发“特权指令”异常及程序崩溃问题咨询
FreeMem()后调用ShowMessage()触发“特权指令”异常及程序崩溃问题咨询
各位Delphi开发者们,我遇到一个奇怪的内存错误引发的崩溃问题,想跟大家请教下原因:
先看这段有问题的代码:
procedure TForm1.Button1Click(Sender: TObject); var pBuffer: PAnsiChar; begin FreeMem(pBuffer); ShowMessage('Test1'); end;
我知道这段代码本身就错了——调用FreeMem(pBuffer)之前根本没通过GetMem或者其他内存分配函数给pBuffer分配过内存,属于非法释放未分配的内存操作。但我搞不懂的是,为什么这个错误会导致这么诡异的崩溃表现,尤其是在大型项目里会挂得特别严重?
给大家说下实际运行的几种情况:
- 在IDE中调试运行时,
FreeMem那一行居然没直接抛出异常,反而在执行ShowMessage('Test1')的时候,弹出了这个错误:Project Project1.exe raised exception class $C0000096 with message 'privileged instruction at 0x02df81f8'.
- 直接运行编译好的exe文件的话,整个程序直接挂死,弹出一个白色的无响应消息窗口,完全关不掉。要是把这个窗口放着不管,还会一串一串弹出更多同样的白色窗口,层层堆叠成瀑布状。
- 有意思的是,如果把
ShowMessage('Test1')换成Application.MessageBox(),虽然不会触发刚才那个“特权指令”异常,但会弹出一个开头为“Invalid...”的错误提示。
有没有大佬能解释下,为什么非法释放内存后,调用ShowMessage会触发这种奇怪的“特权指令”异常,而且程序会彻底挂死?还有为什么换用Application.MessageBox表现又不一样?
备注:内容来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

