線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1407
推到 Plurk!
推到 Facebook!

关於String及pchar的比较

尚未結案
mchakuna
一般會員


發表:41
回覆:45
積分:17
註冊:2004-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-13 02:41:49 IP:211.147.xxx.xxx 未訂閱
各位,是否能解释一下string跟pchar的区别? 我做了这么一个测试    sl   :TStringList; str  :String; pstr :Pchar;    1) 设一个TStringList, 从一个很大的文件(8M)中读入字符串。 2) str  := sl.Lines.GetText; (a)    pstr := sl.Lines.GetText; (b)    str  := sl.Lines.Text;    (c)    究竟(a), (b), (c)三句有什么区别?     另外, 我发现(a)(b)这两句对内存的处理跟(c)有很大区别。当我运行(a)或(b)前后,我用一个内存管理软件查看一下,发现在没有退出程序前内存被占用了约5到10M。而言,对於(c)内存只占了2-5M。为何会这样?    假设上述语句运行前内存为150M。最奇怪的是,即使我用以下语句去强制释放内存,但在整个程序没有退出前内存仍无法运原到150M。    
try
   str  := sl.Lines.GetText; //(a)
   pstr := sl.Lines.GetText; //(b)
   str  := sl.Lines.Text;    //(c)
finally
  sl.Destroy;
end;
是否str或pstr会占用内存? 怎样可以在finally中释放它们所占的内存?
Chance36
版主


發表:31
回覆:1033
積分:792
註冊:2002-12-31

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-13 04:22:39 IP:203.204.xxx.xxx 未訂閱
引言:
try
   str  := sl.Lines.GetText; //(a)
   pstr := sl.Lines.GetText; //(b)
   str  := sl.Lines.Text;    //(c)
finally
  sl.Destroy;
end;
mchakuna 你好 就我所知(依據Delphi HELP),1.PChar:是一字元指標,字串長度僅以終止字元(Chr(0))標定,值的設定是以複製方式行之;2.String:字串長度除了以終止字元(Chr(0))標定外還額外記錄了其實際長度值,值的設定則是以參考計數方式處理。由此可知PChar什麼都可以存,就是Chr(0)不可存入PChar,但是String就可以了,因為它還記錄了字串實際的長度。 以上先說明PChar及String的基楚認知(藍色部份是我備忘用的),以下則針對abc三個動作說明記憶體的配置狀況: a. str := sl.Lines.GetText; //(a) 首先sl.Lines.GetText;會先配置一塊記憶體空間(* 假設為5M),填入sl.Lines.Text進去,然後將其記憶體位置傳回,設定給Str,該記憶空間的參考計數目前為1。 b. pstr := sl.Lines.GetText; //(b) 同樣的sl.Lines.GetText;會先配置一塊記憶體空間(假設為5M),填入sl.Lines.Text進去,然後將其記憶體內容複製一份給PStr(5M)(**),此時記憶體使用量應該為10M,但很快的這個動作完成後,原來GetText所配置的記憶體會自動被釋放,所以記憶體使用量又回到5M。 c. str := sl.Lines.Text; //(c) 將Str變數指向sl.Lines.Text的位址(***),與此同時第a步驟原Str所指向的記憶體位址的參考記數變為0,所以會被釋放掉,但現在Str所指的參考計數卻為2(sl.Lines.Text及Str皆指向它)以這個動作來說,幾乎沒用到額外的記憶體,你所看到2~5M應該是系統、物件內部所使用的記憶體。 最後 sl.Destroy; 只是把Text所指向的記憶位址的參考計數-1,Str還是指向它,另外PStr的內容也還在呀!因此要釋放它們,就在sl.Destroy;(一般我都用sl.Free)後加上以下兩句 Str:=''; PStr:=NULL;或PStr:='';亦可(差不了多少) 以上簡短說明,希望對你有所幫助,若有謬誤也請不吝賜教!大家互相幫忙。 * Sl.Lines.GetText:是Lines的PChar型態的方法,物件內部是以複製內容的方式來取得其值的。 ** PStr與Sl.Lines.GetText皆為PChar型態故採用複製內容的方式來給值。 *** Sl.Lines.Text:是Lines的String型態的屬性,故指定給Str時只是把該記憶位置的參考計數加1罷了,並用不了多少記憶體的。 發表人 - chance36 於 2004/03/13 04:31:54
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-15 13:49:29 IP:203.95.xxx.xxx 未訂閱
這裡有一篇討論很深入的文章, 可以參考看看: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=43759
系統時間:2024-07-06 4:18:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!