关於String及pchar的比较 |
尚未結案
|
mchakuna
一般會員 ![]() ![]() 發表:41 回覆:45 積分:17 註冊:2004-01-07 發送簡訊給我 |
各位,是否能解释一下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 發送簡訊給我 |
引言: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:54try str := sl.Lines.GetText; //(a) pstr := sl.Lines.GetText; //(b) str := sl.Lines.Text; //(c) finally sl.Destroy; end; |
timhuang
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |