procedure TForm1.Button1Click(Sender: TObject);
var
pBuffer: PAnsiChar;
begin
FreeMem(pBuffer);
ShowMessage('Test1');
end;
此代码是错误的,因为我们先使用FreeMem()
而没有使用GetMem()
。但我只是想知道,如果这种情况发生在一个大型项目中,为什么 Delphi 会挂起得这么厉害。
从 IDE 运行,我们没有收到任何错误FreeMem()
,但是在ShowMessage()
:
项目 Project1.exe 引发异常类 $C0000096,消息为“0x02df81f8 处的特权指令”。
运行可执行文件时,整个应用程序会挂起并显示白色消息。无法关闭它。如果您离开该窗口一段时间,则会以“级联”方式收到更多白色消息。
如果您替换ShowMessage()
为Application.MessageBox()
,则不会引发任何错误,但是当您尝试关闭应用程序时,您会收到错误“无效指针”,但奇怪的是有时会出现这种情况。
procedure TForm1.Button1Click(Sender: TObject);
var
pBuffer: PAnsiChar;
begin
FreeMem(pBuffer);
Application.MessageBox(PChar('Test'), PChar(Application.Title), MB_ICONINFORMATION OR MB_TASKMODAL);
end;
我想知道是否可以FreeMem()
安全地使用它。我尝试用这个 proc 来替换FreeMem()
这里找到的:使用单个函数在 Delphi 中释放内存和 nil但它没有帮助,在ShowMessage()
使用后使用时我得到了同样的错误FreeMemAndNil()
。
procedure TForm1.FreeMemAndNil(var P);
var
Tmp: Pointer;
begin
Tmp := Pointer(P);
Pointer(P) := nil;
FreeMem(Tmp);
end;