gpt4 book ai didi

delphi - 为什么在销毁对象后使用该对象时没有收到异常?

转载 作者:行者123 更新时间:2023-12-03 15:49:35 25 4
gpt4 key购买 nike

下面的代码工作得很好,但它不应该!当我单击 Button1 时,该对象首先被销毁,然后使用其值,并且我没有收到任何访问冲突或其他内容...更重要的是,乘法运算给出了正确的结果,这证明 Obj1 没有被破坏!但话又说回来,这也不是真的,因为当我关闭程序时,它不会报告任何内存泄漏。我很困惑。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
MyObj = class(TObject)
Value: Cardinal;
end;

TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
public
Obj1:MyObj;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Obj1.Free;
Obj1.Value:=Obj1.Value * 5;
Caption:=IntToStr(Obj1.Value);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ReportMemoryLeaksOnShutdown:=true;
Obj1:=MyObj.Create;
Obj1.Value:=10;
end;

end.

最佳答案

对象被销毁。内存返回给内存管理器。接下来发生的事情是你无法控制的。内存可以返回给系统。在这种情况下,您会看到运行时错误。或者,内存管理器可以使内存保持事件状态,以便在下次程序请求该大小的 block 时重用。这就是这里发生的情况。

您的程序表现出未定义的行为。任何事情都可能发生,包括程序看起来有效。显然这个程序是错误的,你不能在对象被销毁后访问它们。

如果您使用 FastMM 的完整调试版本,那么您应该会看到错误,因为在这种情况下,会采取步骤来检测释放后的访问。这是一个有用的调试工具。

关于delphi - 为什么在销毁对象后使用该对象时没有收到异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44748621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com