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

請問一下釋放記憶體

尚未結案
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-24 00:10:47 IP:59.121.xxx.xxx 未訂閱
我看了之前各位先進寫的釋放記憶體文章後,我還有對釋放記憶體有疑問,請問什時候需要作釋放記憶體的動作,什麼時候不需要作釋放記憶體的動作,又如果我在TChart裡 new *TSeries1如果我delete TSeries1,這樣我就看不到圖形了,但是我在其它的程式中又無法Delete TSeries1, 請問一下我該如何釋放Tseries的記憶體,另外在一個事件結束,程序裡的不管動態宣告、靜態宣告、指標,不是會消除了嗎,為什麼還要去delete的動作呢,請各位先進可以推薦書讓我了解一下嗎,謝謝
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-24 09:22:09 IP:61.228.xxx.xxx 未訂閱
Schuamcher, 1)只要是NEW出來的物件或記憶體空間,當你不需要用到的時候,就可以把它DELETE掉,以便節省記憶體. 2)關於Tseries的問題,你所謂的其他程式,指的是不同行程(PROCESS)嗎?或者只是函數間的來往問題?如果是在函數間NEW出來的,你只要知道他NEW出來的時候所配的記憶體位置(goble變數或回傳指標方式),你就可以在它不需要用到的時候,呼叫DELETE把這個記憶體釋放掉. 3)當一個事件結束,local變數會消失,但是動態宣告(new 出來的),它不會因為這個事件結束而消失,因為電腦不會自動幫你delete掉你NEW出來的東西.
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-24 11:41:44 IP:219.137.xxx.xxx 未訂閱
Schuamcher 您好:    我也過類似的疑惑,經過高手深入淺出的指導後,在觀念上清楚多了,我不確定您是否已經看過?但我還是將先前的討論連結貼上來,希望對您在釐清一些觀念上的問題有所幫助: 請教自定函式中傳回 new 的物件是否需 delete 的問題? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=67278 要如何用BCB自動產生BUTTON物件並設定屬性呢? http://delphi.ktop.com.tw/topic.php?topic_id=68309
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-24 17:59:59 IP:211.22.xxx.xxx 未訂閱
謝謝兩位的指導,但是我還是有一點疑惑,在下面這段程式中  
Graphics::TBitmap* __fastcall TForm1::GetImage(void)
{
    Graphics::TBitmap *tmpBitmap = new Graphics::TBitmap();        ... 處理過程 ....        return tmpBitmap;
}    void __fastcall TForm1::SomeProc(void)
{
    Graphics::TBitmap *Bitmap = new Graphics::TBitmap();        ... 用到Bitmap(記憶體空間A)的處理過程 ....
    delete Bitmap; // delete 和上面的new匹配        Bitmap = GetImage();        ... 用到Bitmap(記憶體空間B)的處理過程 ....        delete Bitmap; // delete 和GetImage中的new匹配
    Bitmap = NULL;
}     
我不能理解為什麼*tmpBitmap的記憶體有被釋放出來,就是如果我在 void __fastcall TForm1::Button3Click(TObject *Sender) TFastLineSeries * SeriesT1; 處理程序A 我如何在下面的程序delete SeriesT1呢 void __fastcall TForm1::TSheetRiskGraphExit(TObject *Sender) 因為在這個程序中並未宣告SeriesT1 另外我如果新增一個動態矩陣 有任何方法可其全部的初使值為無嗎 或是我要一個一個加進去,但非數字格式要如何加呢,謝謝
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-24 21:47:58 IP:219.137.xxx.xxx 未訂閱
Schuamcher 您好:    關於 TFastLineSeries 那個部份,您可否以下列方式測試一下?
1. 宣告一個全域物件 SeriesT1:
TFastLineSeries *SeriesT1;    2. 在 Button3 的 OnClick() 事件中:
void __fastcall TForm1::Button3Click(TObject *Sender)
{
    SeriesT1 = new TFastLineSeries(this);
    ....
}    3. 在其它欲刪除 SeriesT1 的地方:
void __fastcall TForm1::TSheetRiskGraphExit(TObject *Sender)
{
    delete SeriesT1;
    SeriesT1 = NULL;
    ....
}
上述設定僅是做測試而已,並未加上檢查措施,如果您測試結果可滿足您的需求,請再自行加上檢查的動作。 有關陣列的初值問題,我是這麼做的: int no[10]; ZeroMemory(no, 10*sizeof(int)); 如果是字串陣列的話,好像初值本身就是 NULL 吧?宣告完了之後,陣列裡的每個元素應該全部都是空字串。 發表人 - RedSnow 於 2005/05/24 22:06:53
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-24 23:10:13 IP:59.121.xxx.xxx 未訂閱
謝謝redsnow兄,我測試的結果是可以,但是我想如果TFastSeries * Series1 不是全域變數的話,是否程序void __fastcall TForm1::Button3Click(TObject *Sender)結吏後,記憶體就釋放了嗎
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-24 23:45:42 IP:219.137.xxx.xxx 未訂閱
Schuamcher 您好:    依據下列這一篇中 (先前我提供給您參考的第二個連結),我引用 yyu10 以簡訊告知的資訊來看:    http://delphi.ktop.com.tw/topic.php?topic_id=68309 因為 TFastLineSeries 也是元件的一種,因此 SeriesT1 以 new 來配置記憶體時,它的 owner 會去負責記憶體的釋放動作,因此無需直接呼叫 delete 來釋放記憶體,但是如果 SeriesT1 未設定 owner (為 NULL 時) 的話,就必須要自己使用 delete 來釋放記憶體了。
Schuamcher
一般會員


發表:30
回覆:42
積分:14
註冊:2004-11-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-25 08:29:43 IP:211.22.xxx.xxx 未訂閱
經過redsnow的指導之後,我對記憶體的釋放有更深一層的了解,謝謝
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-25 10:22:21 IP:218.19.xxx.xxx 未訂閱
Schuamcher 您好: 不好意思~我也是借花獻佛而已,我在此獲益不少,自己當然也不能藏私,很高興知道您也有著和我當初相同的感覺,祝您順心~
系統時間:2024-06-08 11:37:36
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!