透過CreateFileMapping讓32位元程式記憶體使用超過2G |
尚未結案
|
slanla2007
一般會員 發表:3 回覆:4 積分:6 註冊:2007-10-04 發送簡訊給我 |
32位元的單一程式是無法讓記憶體使用超過2G..
但是小弟前幾天發現CreateFileMapping可以讓記憶體使用到5G...(記憶體跟虛擬記憶體要設的夠大) 透過下列程式碼可以讓記憶體使用量飆高 [code cpp] //先定義下列結構 struct POD { char text[1048576*64]; } *buf; //Button1Click for(long int i=0;i<10000;i ) { Button1->Caption=i; Application->ProcessMessages(); AnsiString MapName="Map" AnsiString(i); MapHandle = ::CreateFileMapping( (HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, sizeof(POD), MapName.c_str() ); buf = (POD *)::MapViewOfFile( MapHandle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0 ); } [/code] 但是多了 FillMemory(buf->text, sizeof(buf->text), '0'); 就會出問題 因為大概在記憶體飆到2G左右時,buf就會呈現為NULL [code cpp] for(long int i=0;i<10000;i ) { Button1->Caption=i; Application->ProcessMessages(); AnsiString MapName="Map" AnsiString(i); MapHandle = ::CreateFileMapping( (HANDLE)0xffffffff, NULL, PAGE_READWRITE, 0, sizeof(POD), MapName.c_str() ); buf = (POD *)::MapViewOfFile( MapHandle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0 ); if(buf!=NULL) FillMemory(buf->text, sizeof(buf->text), '0'); else { ShowMessage("NULL"); exit(0); } } [/code] 想請教一下...有沒有辦法突破這問題了~@@? 另外... 我想在程式執行中將記憶體釋放..要如何釋放呢??? 透過下列程式碼似乎不能..~"~ [code cpp] for(long int i=0;i<10000;i ) { Button1->Caption=i; Application->ProcessMessages(); AnsiString MapName="Map" AnsiString(i); MapHandle = ::OpenFileMapping( FILE_MAP_WRITE, false, MapName.c_str() ); if(MapHandle!=NULL) { buf = (POD *)::MapViewOfFile( MapHandle, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0 ); UnmapViewOfFile((void *)buf); } } [/code] |
Crest
一般會員 發表:0 回覆:1 積分:0 註冊:2007-12-20 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |