全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1028
推到 Plurk!
推到 Facebook!

free出錯

答題得分者是:careychen
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-29 09:56:29 IP:218.104.xxx.xxx 訂閱
定義了一個類
TSymbol=class
RefDes:String;
PackageName:string;
insertion_code:byte;
SymX,SymY:real;
Rotation:real;
Sym_layer:string;
PinList:TStringList;
end;

有一文件,每行數據都對應上面我定義類的每一部分,類中PinList需要另外獲得,下面i是每行行號,SymLst為TStringList變量,為什麽執行到symbol.free會出錯呢?謝謝!

tmpstr:=StringReplace(SL.Strings[i],'"','',[rfReplaceAll]);
symbol:=TSymbol.Create;
Arr:=mysplit(tmpstr,',');
symbol.RefDes:=Arr[1];
symbol.PackageName:=Arr[3];
symbol.insertion_code:=9;
symbol.SymX:=tomil(strtoint(Arr[4]),xTimes);
symbol.SymY:=tomil(strtoint(Arr[5]),xTimes);
symbol.Rotation:=tomil(strtoint(Arr[6]),10);
symbol.Sym_layer:=copy(Arr[7],1,1);
symbol.PinList:=nil;
SymLst.AddObject(Arr[0],symbol);
symbol.Free;//有這句會出錯
symbol:=nil;
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-29 10:10:03 IP:118.231.xxx.xxx 訂閱
SymLst.AddObject(Arr[0],symbol); ---> ????
symbol.Free;//有這句會出錯

既然要 free ,由何必 assign 給 SymLst ?
如果是要保留(assign 給 SymLst),又如何做可以 free ?

兩者,你只能選一個

不然改成這樣
SymLst.AddObject(Arr[0],symbol);
SymLst.RemoveObject(Arr[0],symbol) ;
symbol.Free;

但這種 code ,有意義嗎?

===================引 用 chhy515 文 章===================
定義了一個類
TSymbol=class
RefDes:String;
PackageName:string;
insertion_code:byte;
SymX,SymY:real;
Rotation:real;
Sym_layer:string;
PinList:TStringList;
end;

有一文件,每行數據都對應上面我定義類的每一部分,類中PinList需要另外獲得,下面i是每行行號,SymLst為TStringList變量,為什麽執行到symbol.free會出錯呢?謝謝!

tmpstr:=StringReplace(SL.Strings[i],'"','',[rfReplaceAll]);
symbol:=TSymbol.Create;
Arr:=mysplit(tmpstr,',');
symbol.RefDes:=Arr[1];
symbol.PackageName:=Arr[3];
symbol.insertion_code:=9;
symbol.SymX:=tomil(strtoint(Arr[4]),xTimes);
symbol.SymY:=tomil(strtoint(Arr[5]),xTimes);
symbol.Rotation:=tomil(strtoint(Arr[6]),10);
symbol.Sym_layer:=copy(Arr[7],1,1);
symbol.PinList:=nil;
SymLst.AddObject(Arr[0],symbol);
symbol.Free;//有這句會出錯
symbol:=nil;
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-29 10:15:52 IP:59.126.xxx.xxx 訂閱
嗯~~~,看了程式碼覺得沒有錯,測了程式碼也沒有錯,所以你有錯的地方就是在你沒貼出來的地方
你再檢查一下試試看

===================引 用 chhy515 文 章===================
定義了一個類
TSymbol=class
RefDes:String;
PackageName:string;
insertion_code:byte;
SymX,SymY:real;
Rotation:real;
Sym_layer:string;
PinList:TStringList;
end;

有一文件,每行數據都對應上面我定義類的每一部分,類中PinList需要另外獲得,下面i是每行行號,SymLst為TStringList變量,為什麽執行到symbol.free會出錯呢?謝謝!

tmpstr:=StringReplace(SL.Strings[i],'"','',[rfReplaceAll]);
symbol:=TSymbol.Create;
Arr:=mysplit(tmpstr,',');
symbol.RefDes:=Arr[1];
symbol.PackageName:=Arr[3];
symbol.insertion_code:=9;
symbol.SymX:=tomil(strtoint(Arr[4]),xTimes);
symbol.SymY:=tomil(strtoint(Arr[5]),xTimes);
symbol.Rotation:=tomil(strtoint(Arr[6]),10);
symbol.Sym_layer:=copy(Arr[7],1,1);
symbol.PinList:=nil;
SymLst.AddObject(Arr[0],symbol);
symbol.Free;//有這句會出錯
symbol:=nil;
------
價值的展現,來自於你用哪一個角度來看待它!!
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-29 10:17:32 IP:218.104.xxx.xxx 訂閱
謝謝回覆!!
照您說的好像symbol.free后,SymLst里的對象也不存在了?
我是這樣想的,讀完一行數據后產生一個對象,將這一行對應對象加到SymLst里,然后將對像銷毀,再讀第二行產生第二個對象,這樣做是防止上一行數據影響到下一行!!
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-29 10:23:08 IP:218.104.xxx.xxx 訂閱
謝謝回覆!!
好像是這樣的,單行調試了下,是可以的,謝謝嘍,我再看下!!
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-29 11:06:55 IP:218.104.xxx.xxx 訂閱
好像發現了,不過不明白呢!!
如果我加入FreeAndNil(symbol),那么到下面的Pin.RefDes:=GetSym.RefDes就會出錯,去了那句就不會有問題!!
TPin=class
Pin_Number:string;
PinX,PinY:real;
NetName:string;
RefDes:string;
Pin_Layer:string;
TestPoint:char;
end;

GetSym:TSymbol;
GetSym:=TSymbol(SymLst.Objects[SymLst.IndexOf(Arr2[0])]);
Pin:=TPin.Create;
Pin.RefDes:=GetSym.RefDes;//到這裡出錯
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-29 12:53:32 IP:59.126.xxx.xxx 訂閱
你的第二個問題,就是上面 syntax 回你的,

1、在你一開始的程式碼中
symbol:=TSymbol.Create; // 這時候 Create 了一個 物件在這邊,請注意這是指 symbol 指標指到一個物件

2、在下面一點點的地方
SymLst.AddObject(Arr[0],symbol); // 這個是第二個指標指向同一個物件

3、但再來的
symbol.Free; // 這是那個物件被你 Free 掉了
symbol:=nil; // 而指標也清掉了

4、所以雖然第二點中的指標還指向那個物件,但那個物件【已經消滅了】,所以你別的地方再引用時會出錯

所以你這種寫法,可以在程式啟動時, Create SymList
而程式要關閉,或是 Form 要關閉前,才會掃描 SymList 中是否有殘留的物件,有的話,一次 Free




===================引 用 chhy515 文 章===================
好像發現了,不過不明白呢!!
如果我加入FreeAndNil(symbol),那么到下面的Pin.RefDes:=GetSym.RefDes就會出錯,去了那句就不會有問題!!
TPin=class
Pin_Number:string;
PinX,PinY:real;
NetName:string;
RefDes:string;
Pin_Layer:string;
TestPoint:char;
end;

GetSym:TSymbol;
GetSym:=TSymbol(SymLst.Objects[SymLst.IndexOf(Arr2[0])]);
Pin:=TPin.Create;
Pin.RefDes:=GetSym.RefDes;//到這裡出錯
------
價值的展現,來自於你用哪一個角度來看待它!!
chhy515
一般會員


發表:3
回覆:9
積分:2
註冊:2008-08-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-29 13:52:24 IP:218.104.xxx.xxx 訂閱
謝謝回覆!!!
經你知道,問題解決了,謝謝嘍~~
系統時間:2024-05-05 16:09:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!