求助:一个非常奇怪的问题,用了 dipose() ,反而不行了,这是为什么啊?谢谢! ( 积分: 40 )

  • 主题发起人 主题发起人 宇宙神
  • 开始时间 开始时间

宇宙神

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
ss:string;
ss1:^string;
begin
ss:='12345';
new(ss1);
ss1^:=ss;
TreeView1.Items[1].Data:=ss1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
CurrenNode:TTreeNode;
Ipvalue:^string;
Ipvaluestr:string;
begin

CurrenNode:=treeview1.Items[1];
new(Ipvalue);
try
Ipvalue:=CurrenNode.Data;
Ipvaluestr:=Ipvalue^;
finally
dispose(Ipvalue);
end;
showmessage(Ipvaluestr);
end;

end.


现在问题是:
我单击一次 Button1 ,show 出 字符串 12345
我再次单击,就出现错误了,是地址路径错的那种

如果,我写

procedure TForm1.Button1Click(Sender: TObject);
var
CurrenNode:TTreeNode;
Ipvalue:^string;
Ipvaluestr:string;
begin

CurrenNode:=treeview1.Items[1];
new(Ipvalue);
Ipvalue:=CurrenNode.Data;
Ipvaluestr:=Ipvalue^;

showmessage(Ipvaluestr);
end;


则没有错误,这是什么原因啊?

谢谢!
 
procedure TForm1.Button1Click(Sender: TObject);
var
CurrenNode:TTreeNode;
Ipvalue:^string;
Ipvaluestr:string;
begin

CurrenNode:=treeview1.Items[1];
new(Ipvalue);
//你建立一个IPValue的指针,并分配了空间
try
Ipvalue:=CurrenNode.Data;
// 你建立一个IPValue的指针,和你要的节点指向同一个地方,也就是说
Ipvaluestr:=Ipvalue^;
finally
dispose(Ipvalue);
// 你现在是不是把Data释放了,明白?
end;
showmessage(Ipvaluestr);
end;

-------------------

而你后面的办法会有什么问题呢,分配了很多内存,但是没有释放,结果点多了就会出现内存溢出
 
谢谢大哥!
那我的程序要怎么改啊?

要在什么地方释放呢?
 
后退
顶部