16,748
社区成员
发帖
与我相关
我的任务
分享
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2 :=Edit1;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FreeAndnil(Edit1);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
FreeAndnil(Edit2);
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
if Edit1=nil then
showMessage('Edit1=nil');
if Edit2=nil then
showMessage('Edit2=nil');
if (Edit1 is TEdit) then
showMessage('Edit1 is TEdit');
if (Edit2 is TEdit) then
showMessage('Edit2 is TEdit');
end;
end.
procedure TComponent.SetReference(Enable: Boolean);
var
Field: ^TComponent;
begin
if FOwner <> nil then
begin
Field := FOwner.FieldAddress(FName);
if Field <> nil then
if Enable then Field^ := Self else Field^ := nil;
end;
end;
Type
PRecData = ^TRecData;
TRecData = record
Str : string;
end;
var
P:PRecData;
begin
try
new(P);
P.Str := 'aaa'; //以下2句
P^.Str := 'bbb'; //
finally
Dispose(P);
end;
end;
procedure FreeAndNil(var Obj);
var
Temp: TObject;
begin
Temp := TObject(Obj);
Pointer(Obj) := nil;
Temp.Free;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FreeAndnil(Edit1);
{此时,AAA已经被释放,并且Edit1的指针值被赋值为nil}
{但是,此时Edit2的值并不是nil,尽管它所指向的AAA已经被释放}
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
{如果先执行FreeAndnil(Edit1);再执行下面这句,必然导致一个错误
因为Edit2此时不是nil,但它指向的AAA已经释放
如果先执行FreeAndnil(Edit2);则Edit1和Edit2同时变为nil,
因为:在Edit2 := Edit1的赋值的时候,不仅仅是指针值的赋值,同时Edit2作为了Edit1的“引用”!
因此,先执行下面这句,再执行FreeAndnil(Edit1);就不会出错了}
FreeAndnil(Edit2);
end;