procedure TForm1.Button1Click(Sender: TObject);
var
pBuffer: PAnsiChar;
begin
FreeMem(pBuffer);
ShowMessage('Test1');
end;
这段代码是错误的,因为我们使用 FreeMem() 而不先使用 GetMem()。但只是想知道为什么 Delphi 挂起如此严重,这种情况是否会发生在一个巨大的项目中。
从 IDE 运行,我们在 FreeMem() 行上没有收到任何错误,但在 ShowMessage() 上:
Project 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。 我尝试用这个过程来替换此处找到的 FreeMem():text 但这没有帮助,在使用 FreeMemAndNil() 之后使用 ShowMessage() 时我得到了同样的错误
procedure TForm1.FreeMemAndNil(var P);
var
Tmp: Pointer;
begin
Tmp := Pointer(P);
Pointer(P) := nil;
FreeMem(Tmp);
end;
您正在通过释放尚未分配的内存来调用未定义的行为。 您的
pBuffer
变量是 未初始化,因此它将包含以前在它现在占用的内存块中发生的任何随机值,因此您正在尝试释放随机内存地址。