关于链表内存释放问题请教 ?问了好几天了!大家来看看呀。 (50分)

  • 主题发起人 主题发起人 zxp_ping
  • 开始时间 开始时间
Z

zxp_ping

Unregistered / Unconfirmed
GUEST, unregistred user!
我建立链表时,从一个库中读数据:
代码:
Function TComputerInfo.ReadFromDB:Boolean;
var
    pReadInfo :PComputerInfo;
    sTemp, sUseTime, sTag, sNight :String;
begin
    result := false;
    try
        with dmServer.qrytemp do
        begin
            Close;
            sql.Clear;
            sql.Add('Select * from tbComputerInfo');
            Prepare;
            Open;
            First;
            while not eof do
            begin
                pReadInfo := new(PComputerInfo);
                pReadInfo^ := TMyComputerINfo.Create;

                pReadInfo.iImageIndex := FieldByName('ImageIndex').AsInteger;
                pReadInfo.sComputerName := FieldByName('ComputerName').AsString;
                pReadInfo.dBeginTime := FieldByName('BeginTime').AsDateTime;
                pReadInfo.sCardNo := FieldByName('CardNo').AsString;
                pReadInfo.sCID := FieldByName('CID').AsString;
                pReadInfo.sGroupName := FieldByName('UseType').AsString;
                pReadInfo.pNext := nil;
                AddItem(pReadInfo);
                pReadInfo := nil;
                next;
           end;
        end;
    except
        result := false;
        exit;
    end;
    result := true;
end;

如上程序段,用MemProof总是指示
pReadInfo := new(PComputerInfo);
这一行,有8个字节的泄漏?这样将其加到链表中还用得着释放吗?释放了不就相应链表中也
释族掉了吗?
 
大家能给予关注都表示非常感激!
 
大家讨论一下呀。是不是只是这个变量没释放?那如何释放这个变量?或是MemProof测试
结果错了?
 
分少就没人关注?
 
为什么???
 
To 昱昱 : 兄弟指得是?
 
var pReadInfo :^PComputerInfo;
...............
new(pReadInfo );//new是过程,没返回值吧
pReadInfo^ := TMyComputerINfo.Create;
pReadInfo^.iImageIndex := FieldByName('ImageIndex').AsInteger;
pReadInfo^.sComputerName := FieldByName('ComputerName').AsString;
...........


 
new(pReadInfo );与pReadInfo := new(PComputerInfo);应该是一样的,我刚才试了一下,
还是有8个字节。。。
 
pReadInfo := new(PComputerInfo)这样是不对的
你试一下这个
system.New(pReadInfo);
 
这样还是一样,指示有8个字节没释放?(不是总共8个字节,而是每分配一个空间都会有
8个没释放?)难道变量也用得着释放吗???
 
你应该这样写:
Function TComputerInfo.ReadFromDB:Boolean;
var
{去掉指针定义:
pReadInfo: pComputerInfo;}
pReadInfo :TMyComputerINfo;
sTemp, sUseTime, sTag, sNight :String;
begin
result := false;
try
with dmServer.qrytemp do
begin
Close;
sql.Clear;
sql.Add('Select * from tbComputerInfo');
Prepare;
Open;
First;
while not eof do
begin
{此处直接赋值给对象引用}
pReadInfo := TMyComputerINfo.Create;

pReadInfo.iImageIndex := FieldByName('ImageIndex').AsInteger;
pReadInfo.sComputerName := FieldByName('ComputerName').AsString;
pReadInfo.dBeginTime := FieldByName('BeginTime').AsDateTime;
pReadInfo.sCardNo := FieldByName('CardNo').AsString;
pReadInfo.sCID := FieldByName('CID').AsString;
pReadInfo.sGroupName := FieldByName('UseType').AsString;
pReadInfo.pNext := nil;
AddItem(pReadInfo);
{不能在这儿释放, 你必须保留这个对象链的首对象, 最后专门释放}
//pReadInfo.free;
next;
end;
end;
except
result := false;
exit;
end;
result := true;
end;
 
pReadInfo := nil;并不能释放空间 只是 给preadinfo 置nil值
pReadInfo := new(PComputerInfo);
分配的空间须用dispose 才能 释放

建议你看看delphi书 基本的概念

具体的我在下面的贴子中有详细的说明
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1064431


 
随便写一段
type
pnode=^tnode;
tnode=record
.....
aaa:string;
next:pnode; //向后指针
end;
var
front,tmp,head:pnode;
i:integer;
begin
.......
i:=0
repeat //填写链表
new(tmp);tmp^.next:=nil;
tmp.aaa :=' ';
if i>0 then
tmp.next:=front;
front:=tmp;
i:=i+1;
end;
until ......;
head:=tmp;
......
//释放链表
while not(head^.next=nil) do
begin
tmp:=head^.next;
dispose(head);
head:=tmp;
end;
dispose(head);
end;
可能有语法错,但基本如此;
 
我以前用纯C时才要这样考虑问题
pReadInfo := nil;???释放吗???
 
多人接受答案了。
 
后退
顶部