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

TMemoryStream?

答題得分者是:dllee
phototin
初階會員


發表:13
回覆:30
積分:29
註冊:2002-06-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-01 16:17:29 IP:61.224.xxx.xxx 未訂閱
問題一: TMemoryStream *memstream = new TMemoryStream(); 請問, memstream->clear(); delete memstream; memstream->free(); 這三行有何不同? 問題二: 我的程式需要不斷的儲存資料至記憶體, 該如何在正確時機, 建立→儲存→清除→儲存→清除→…→最後釋放TMemoryStream, 才不會導致記憶體被我耗完?
tony115722
一般會員


發表:53
回覆:63
積分:23
註冊:2002-07-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-10-01 16:25:14 IP:202.145.xxx.xxx 未訂閱
對耶..我也一直有這個疑問...希望先進能幫忙回答這個問題.. I like DeBug
------
I like DeBug
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-10-01 16:58:21 IP:203.73.xxx.xxx 未訂閱
引言: 問題一: TMemoryStream *memstream = new TMemoryStream(); 請問, memstream->clear(); delete memstream; memstream->free(); 這三行有何不同? 問題二: 我的程式需要不斷的儲存資料至記憶體, 該如何在正確時機, 建立→儲存→清除→儲存→清除→…→最後釋放TMemoryStream, 才不會導致記憶體被我耗完?
提供給你「我的做法」 你可以做一個小小的實驗 也就是寫一個很簡單的 function 如下 void __fastcall TForm1::XXXX(void) { TMemoryStream *ms=new TMemoryStream; ms->Size=1024; ms->Position=0; ms->Write(Buf, ms->Size); .............. ms->Size=0; ms->Size=2048; ms->Position=0; ms->Write(Buf, ms->Size); .............. delete ms; } // end of XXXX 備註:假設 Buf 是個塊存有資料的記憶體 然後用一個 Timer 去不斷的 run 這個 function 在 run 的同時,你把「工作管理員」打開 選擇「效能」這個 tab 仔細觀查 memory 的變化 當然~~你如果覺得變化不大 可以把以上 code 中的 size 加大(便於觀查) 你會發現這種做法是沒有問題的 至於 clear 和 free 我並沒有用過 因此~~我不敢亂說 話雖然如此~~ 但是只用 new 和 delete 也可以達到目的 希望對你有所幫助
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
phototin
初階會員


發表:13
回覆:30
積分:29
註冊:2002-06-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-10-03 03:02:36 IP:61.216.xxx.xxx 未訂閱
感謝回應, 關於第二個問題,我已經解決了, 我的程式要使Server不斷的傳檔給Client, 由於我完全沒有讓Server sleep一下, 所以導致記憶體被我耗完, 跟我釋放記憶體的時機,並沒有太大關係! 不過,第一個問題,我還是很想弄懂。
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-10-06 12:24:43 IP:203.204.xxx.xxx 未訂閱
引言: 問題一: TMemoryStream *memstream = new TMemoryStream(); 請問, memstream->clear(); delete memstream; memstream->free(); 這三行有何不同? 問題二: 我的程式需要不斷的儲存資料至記憶體, 該如何在正確時機, 建立→儲存→清除→儲存→清除→…→最後釋放TMemoryStream, 才不會導致記憶體被我耗完?
如同 RaynorPao 提供的範例,在 ms->Size=1024; 時,其實是會叫用 TMemoryStream 的 SetSize() 由它去動態改變 TMemoryStream 所占用的記憶體。 其實小弟在使用 TMemoryStream 時,也是如同您問題二所述,在物件的建構元中就將 TMemoryStream 給 new 出來,而在其他 Method 中則去改變大小或 Clear()、Read/WriteBuffer()... 而在最後解構元中再去 delete 它就可以了。 而 memstream->Free(); 是不可以叫用的,這個 Free() 是繼承自 TObject 的東東,在你下 delete memstream; 時就會叫用它了,在 BCB 的說明中也提到這個 Free() 不可以直接叫用。 如果你只是要清除 TMemoryStream 所占用的記憶體可以用 Clear() 或 Size=0 而使用 TMemoryStream 最大的好處是不會有「記憶體被我耗完?」的問題,當然,如果你就是要一個很大很大的記憶體那還是會耗完,如果只是 Size=1000; 再 Size=200000; 再 Size=1000000; 再 Size=1000; ... 那它所占的就是你所指定的大小,而會發生浪費記憶體的情況是,在不用時沒有 delete 掉它,才會發生浪費的情況。 沒空更新的網頁...
C及指標教學 http://coolsite.to/dllee介紹Shells http://coolsite.to/ushells
------
http://www.ViewMove.com
phototin
初階會員


發表:13
回覆:30
積分:29
註冊:2002-06-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-10-09 22:07:15 IP:61.216.xxx.xxx 未訂閱
謝謝,學了很多!
系統時間:2024-11-23 20:56:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!