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

請問該如何釋放記憶體?

尚未結案
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-04 21:10:03 IP:219.80.xxx.xxx 未訂閱
我連續按下了5次的button1去new出同樣大小的記憶體空間,但是我按button2之後卻只能釋放掉一次的記憶體空間.請問我該如何再按下5次button2之後,把之前所new的全部release掉? 是否要去記錄它的記憶體位址或是其它好方法? 謝謝.
char *pBuffer;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  pBuffer=new char[1000000];
  for(int i=0;i<1000000;i  )
  {
    pBuffer[i]=0x0;
    Application->ProcessMessages();
  }
}    void __fastcall TForm1::Button2Click(TObject *Sender)
{
  delete [] pBuffer;
}
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-05 03:41:19 IP:211.76.xxx.xxx 未訂閱
nlj859你好:    如果pBuffer沒有在其他地方用到,宣告成local變數是比較好的做法。並且在Button1Click函式離開前delete即可。    如果pBuffer在其他地方有用到,那button1在第二、三…次按下時,可以不用再配置一次,因為第一次已經配置過了。Code可以改成:     
 
char* pBuffer = 0;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  if(!pBuffer)
     pBuffer=new char[1000000];
  for(int i=0;i<1000000;i  )
  {
    pBuffer[i]=0x0;
    Application->ProcessMessages();
  }
}    void __fastcall TForm1::Button2Click(TObject *Sender)
{
  delete [] pBuffer;
}    
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-05 08:57:12 IP:211.76.xxx.xxx 未訂閱
nlj859 您好:    如果您是希望按Button1配置記憶體,按Button2釋放配置的記憶體,那的確要把先前配置記憶體的起始位址記錄下來(產生一個指標陣列與一個數值記錄Button1共被按了幾次),這樣才能正確的釋放所有先前配置記憶體。 但這樣還存在釋放的順序問題,也就是說,您可能先產生五塊記憶區,但要先釋放哪一塊?就必須事前自行設定好。 目前您的做法只會釋放最後配置的那一塊,而這之前的就漏失掉了。 或者可以把記憶體配置寫成一個class,在建構時配置記憶體,解構時釋放記憶體。如此一來,又能隨時產生新物件配置記憶體,又不怕忘了釋放記憶體。 對您的程式碼作了一些更改。您很貼心的使用Application->ProcessMessages();,怕初值設定時間過長;提供memset(.)可以提升速度,給您參考。 < class="code">char *pBuffer; void __fastcall TForm1::Button1Click(TObject *Sender) { pBuffer=new char[1000000]; ShowMessage(__int64(pBuffer)); // 由此觀察配置記憶體的起始位址。 /* for(int i=0;i<1000000;i ) { pBuffer[i]=0x0; Application->ProcessMessages(); } */ memset(pBuffer, 0x0, 1000000); // 可取代上述/* ...*/的內容。 delete [] pBuffer; } RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-05 16:27:12 IP:163.28.xxx.xxx 未訂閱
謝謝pwipwu和richtop的回答,    我們已經知道每次new出來的記憶體空間和位址之後,當我們要釋放某段記憶體時,程式方面要怎麼去撰寫? 不知是否可使用底下那種方式去撰寫??
   BOOL SetProcessWorkingSetSize(
    HANDLE hProcess,        // open handle to the process of interest
    DWORD dwMinimumWorkingSetSize,        // specifies minimum working set size
    DWORD dwMaximumWorkingSetSize         // specifies maximum working set size
   );
可否指導一下,謝謝. 發表人 - nlj859 於 2004/08/05 17:48:11
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-05 18:27:45 IP:211.76.xxx.xxx 未訂閱
nlj859 您好:    
引言: 我們已經知道每次new出來的記憶體空間和位址之後,當我們要釋放某段記憶體時,程式方面要怎麼去撰寫? 不知是否可使用底下那種方式去撰寫??
   BOOL SetProcessWorkingSetSize(
    HANDLE hProcess,        // open handle to the process of interest
    DWORD dwMinimumWorkingSetSize,        // specifies minimum working set size
    DWORD dwMaximumWorkingSetSize         // specifies maximum working set size
   );
可否指導一下,謝謝.
不是很清楚您的意思。理論上只要您記住配置記憶體的傳回位置,就可以釋放那塊記憶體,因此用什麼方式去記記憶體的位址應該都沒問題才對。
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-05 18:54:22 IP:163.28.xxx.xxx 未訂閱
引言: 不是很清楚您的意思。理論上只要您記住配置記憶體的傳回位置,就可以釋放那塊記憶體,因此用什麼方式去記記憶體的位址應該都沒問題才對。 < face="Verdana, Arial, Helvetica"> 因為我配置一個記憶體空間後,不一定馬上要釋放掉... 當我要釋放掉時,一定要決定要釋放掉之前的哪個記憶體區塊. 不曉得可否簡單講解該如何釋放某個記憶體位置. ex: 我連續配置了4個不同長度的記憶體空間,我要釋放掉第2個的話,那釋放的程式該如何撰寫? 起始位址 長度 00CF8000 1000000 00EB0004 100000 00FA4610 10000 01098D1C 1000 謝謝.
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-05 20:19:23 IP:211.76.xxx.xxx 未訂閱
引言: ex: 我連續配置了4個不同長度的記憶體空間,我要釋放掉第2個的話,那釋放的程式該如何撰寫? 起始位址 長度 00CF8000 1000000 00EB0004 100000 00FA4610 10000 01098D1C 1000 謝謝.
假設上述的資料存在下列的結構中:
struct MemoryAddr
{ char *ptr;
  int  len;
};    MemoryAddr ma[] =
{ (char *)0x00CF8000,  1000000,
  (char *)0x00EB0004,  100000,
  (char *)0x00FA4610,  10000,
  (char *)0x01098D1C,  1000, };  // 此寫法不好,只是要表示目前的值而已。    // 欲刪除編號為index的記憶體空間:
  delete [] ma[index].ptr;  // 長度可以不必填入[]中。
RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### 發表人 - richtop 於 2004/08/05 22:22:46
系統時間:2024-07-01 17:36:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!