You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 12:20:35