請問有關free 的問題 |
尚未結案
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
function b():tstringlist; begin result := tstringlist.create(); . . . end; procedure a(); var ts : tstringlist; begin ts := tstringlist.create(); .. . . ts.assign(b); . . ts.free(); end;以上是我的code 問題是 b 的 output 是 tstringlist 如果我在b 最後 result.free 會當a call b 的時候會有 memory error 但如果沒有free, 那b 就不會free memory ... b 我會重複的做很多次 那是不是造成memory leakage 那在 a 可以 free b 嗎? 在 a 裡面 b.free 又不可以, 可以怎樣呢? 謝謝 |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
因為不清楚您詳細情況 function b() 中不要做 tstringlist.create() 的動作, 就不會不斷配置記憶體了, 在別的地方做, 或者將 tstringlist.create() 產生的物件宣告為全域變數使用, 這樣哪裡都可以使用, 也可以 free 它 *********************
如果您滿意答案,請結案
*********************
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
您好:
您那樣做不正確,b回傳必須要有一個實體去接收. function b():tstringlist;
begin
result := tstringlist.create();
end; procedure TForm1.Button2Click(Sender: TObject);
var ts,ts1 : tstringlist;
begin
ts := tstringlist.create();
ts1:=b();
ts.free();
ts1.free();
end; a.assign(b)//這樣只是把b資料傳給a 問題是 b 的 output 是 tstringlist
如果我在b 最後 result.free
會當a call b 的時候會有 memory error
b已經被你free掉了,他沒的call了 其他問題看一下上面範例,就應該 知道了. 發表人 - supman 於 2005/04/26 16:34:19
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
您好:
ts.assign (b) 不是已經將 b 的結果copy 到 ts 的實体了嗎?
是的,但您b()所配置出來的TStringList,跑去哪了? ts.assign(b) 跟 ts := b 分別是怎樣?
剛看到wameng大的解釋,發現自己搞錯,做以下範例給您參考. function b():tstringlist;
var
s:TStringList;
begin
s:=tstringlist.create();
s.add('1234');
result :=s;
end; procedure TForm1.Button2Click(Sender: TObject);
var ts,ts1 : tstringlist;
begin
ts := tstringlist.create();
ts1:=b();//把b的位址指向ts1
ts:=ts1;
ts1.free();//把ts1釋放掉
ts.Add('1234');//這裡將會產生錯誤訊息,因為ts,ts1是同一位址,且被Free掉了
ts.free();
end; 另外 想請問pcboy2 你的意思是不是說在 b 裡面是不用 result := tstringlist.create(); ?
當然還是要,不然配置記憶體給誰?pcboy2的意思是您直接把他定義成全域變數,這樣就不用只要在程式一開始做配置就可以,而不會每次呼叫b就配置一次. 發表人 - supman 於 2005/04/27 09:56:00 發表人 - supman 於 2005/04/27 10:15:56
|
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
ts.assign(b) 跟 ts := b 分別是怎樣?
>ts.assign(b)
指的是將 B的內容拷貝至TS 中。(內容會有二份,一為TS、一為S)
TS := B
就一意味指針位置相同。TS=B B=TS(內容只有一份) 因此
procedure a(); var ts : tstringlist; begin ts := b;{等於B的回傳並已建立好物件 Result := TStringList.Create;} Try ... Finally ts.free(); End end; 或者 Procedre b(Strings:TStrings); begin ..... {不需要在 Create 直接帶入} end; procedure a(); var ts : tstringlist; begin ts := Tstringlist.Create; Try B(Ts); ... Finally ts.free(); End end; |
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
真的不知道為什麼? 在 b 裡面如果按照各位說 不要 result := tstringlist.create(); 就會有 error 再講一點的是 我的 function b (..): tstringlist;
不是 procedure b( var ts:tstrinlist); 另外按照 wameng 大大所說的 ts.assign(b) 跟 ts := b 分別是怎樣?
>ts.assign(b)
指的是將 B的內容拷貝至TS 中。(內容會有二份,一為TS、一為S)
TS := B
就一意味指針位置相同。TS=B B=TS(內容只有一份) 這樣的話是不是代表 procedure 跟 function 裡的變數都是以 static 去宣告的?
|
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
|
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
|
supman
尊榮會員 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
|
jest0024
高階會員 發表:11 回覆:310 積分:224 註冊:2002-11-24 發送簡訊給我 |
1. procedure b(var temp:tstringlist); begin temp.... //使用已建立的obj temp.... end; procedure a(); var ts,temp : tstringlist; begin ts := tstringlist.create(); temp:=tstringlist.create; ts.assign(temp); ts.free(); temp.free; end; 2. function b():tstringlist; begin result:=tstringlist.create; <-傳回建立obj的指標!! ... ... end; procedure a(); var ts,tmp : tstringlist; begin ts := tstringlist.create(); tmp:=b(); //<-有建立,就得消除 ts.assign(tmp); tmp.free; //消除obj ts.free(); end;發表人 - jest0024 於 2005/04/27 20:39:01 |
SamSam1230
中階會員 發表:128 回覆:178 積分:65 註冊:2004-12-23 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |