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

請問有關free 的問題

尚未結案
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-26 15:17:53 IP:218.103.xxx.xxx 未訂閱
     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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-26 15:36:21 IP:210.69.xxx.xxx 未訂閱
因為不清楚您詳細情況 function b() 中不要做 tstringlist.create() 的動作, 就不會不斷配置記憶體了, 在別的地方做, 或者將 tstringlist.create() 產生的物件宣告為全域變數使用, 這樣哪裡都可以使用, 也可以 free 它 ********************* 如果您滿意答案,請結案 *********************
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-26 16:12:50 IP:61.222.xxx.xxx 未訂閱
procedure a();
var ts : tstringlist;
begin
    ts := b;
    Try
     ...
    Finally
     ts.free();
    End
end;
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-26 16:14:23 IP:61.70.xxx.xxx 未訂閱
您好: 您那樣做不正確,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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-27 09:27:29 IP:218.103.xxx.xxx 未訂閱
想請問一下 ts.assign (b) 不是已經將 b 的結果copy 到 ts 的實体了嗎? ts.assign(b) 跟 ts := b 分別是怎樣? 另外 想請問pcboy2 你的意思是不是說在 b 裡面是不用 result := tstringlist.create(); ? 謝謝
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-27 09:38:47 IP:61.70.xxx.xxx 未訂閱
您好: 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-27 10:01:23 IP:61.222.xxx.xxx 未訂閱
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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-27 10:22:07 IP:218.103.xxx.xxx 未訂閱
真的不知道為什麼? 在 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-04-27 10:41:31 IP:61.70.xxx.xxx 未訂閱
您好: >再講一點的是 >我的 function b (..): tstringlist; >不是 procedure b( var ts:tstrinlist); 好像沒人認為你是宣告成procedure耶...@@ 這樣的話是不是代表 procedure 跟 function 裡的變數都是以 static 去宣告的? 這句話怪怪的,要看狀況而定吧 TS:=B B的位址給TS,這當然是不會是變數阿.
SamSam1230
中階會員


發表:128
回覆:178
積分:65
註冊:2004-12-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-04-27 12:40:57 IP:218.103.xxx.xxx 未訂閱
謝謝大大 但問題回到原來的點 這樣的話是不是我不用 free b 呢? b() :tstringlist 那個result 是會一直的存在 另外我的program 好像有memory leak 請問有一些工具是可以去看那裡有memory leak for delphi 4 謝謝
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-04-27 16:56:50 IP:61.70.xxx.xxx 未訂閱
您好: >但問題回到原來的點 問題並沒有回到原點,前面已經有許多人提出方式了. 這樣的話是不是我不用 free b 呢? b() :tstringlist 那個result 是會一直的存在 當然是要,您要給他一個窩住,然後釋放他. 另外我的program 好像有memory leak 請問有一些工具是可以去看那裡有memory leak for delphi 4 Delphi的我就不曉得了,看看有沒有哪位大大有用過相關軟體.
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-04-27 20:26:58 IP:211.74.xxx.xxx 未訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-04-28 09:45:19 IP:218.103.xxx.xxx 未訂閱
謝謝各位大大 我終於明白各位所說的 因為之前一直都不太明白 assign 跟 := 的分別 但想再更確定一下 如果有兩個不同的procedure 去 call b() 那那兩個result 的地址是一樣的嗎? 謝謝
系統時間:2024-05-17 9:50:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!