請問該如何釋放記憶體? |
尚未結案
|
nlj859
資深會員 發表:139 回覆:375 積分:322 註冊:2004-03-20 發送簡訊給我 |
我連續按下了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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 不是很清楚您的意思。理論上只要您記住配置記憶體的傳回位置,就可以釋放那塊記憶體,因此用什麼方式去記記憶體的位址應該都沒問題才對。 >>< face="Verdana, Arial, Helvetica"> 因為我配置一個記憶體空間後,不一定馬上要釋放掉... 當我要釋放掉時,一定要決定要釋放掉之前的哪個記憶體區塊. 不曉得可否簡單講解該如何釋放某個記憶體位置. ex: 我連續配置了4個不同長度的記憶體空間,我要釋放掉第2個的話,那釋放的程式該如何撰寫? 起始位址 長度 00CF8000 1000000 00EB0004 100000 00FA4610 10000 01098D1C 1000 謝謝. |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
引言: 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 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |