如何釋放記憶體? |
尚未結案
|
kikikaka
一般會員 發表:32 回覆:28 積分:12 註冊:2003-09-26 發送簡訊給我 |
請問各位高手:
小弟以下的寫法,有正確的釋放記憶體嗎?
謝謝大家的幫忙!
byte **tNow, **tNext; Graphics::TBitmap *pBitmap3=new Graphics::TBitmap; Graphics::TBitmap *pBitmap4=new Graphics::TBitmap; pBitmap3->Assign(Image3->Picture->Bitmap); pBitmap4->Assign(Image4->Picture->Bitmap); tNow= new byte*[pBitmap3->Height]; tNext= new byte*[pBitmap4->Height]; for (int z = 0; z < pBitmap3->Height; z ) { tNow[z] = new byte[pBitmap3->Width]; tNext[z] = new byte[pBitmap4->Width]; } //釋放記憶體 for(int y = 0; y < pBitmap3->Height; y ) { delete tNow[y], tNext[y]; } delete pBitmap3, pBitmap4, tNow, tNext; |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
kikikaka 您好: 您釋放記憶體的順序沒錯。 動態陣列記憶體的釋放,要加上[]:
delete [] pointer2Array; 另外您給了個有趣的寫法:
delete ptr1, ptr2; 但它是否完全正確,我沒有十成的把握。所以為了保險起見,我會寫成:
delete ptr1;
delete ptr2; 如果是陣列,那我就更沒有把握了,
delete [] ptrArray1, ptrArray2;
是否與下列宣告全等?
delete [] ptrArray1;
delete [] ptrArray2;
void __fastcall TForm1::Button1Click(TObject *Sender) { byte **tNow, **tNext; Graphics::TBitmap *pBitmap3=new Graphics::TBitmap; Graphics::TBitmap *pBitmap4=new Graphics::TBitmap; pBitmap3->Assign(Image1->Picture->Bitmap); pBitmap4->Assign(Image1->Picture->Bitmap); tNow= new byte*[pBitmap3->Height]; tNext= new byte*[pBitmap4->Height]; for (int z = 0; z < pBitmap3->Height; z ) { tNow[z] = new byte[pBitmap3->Width]; tNext[z] = new byte[pBitmap4->Width]; } //釋放記憶體 for(int y = 0; y < pBitmap3->Height; y ) { delete [] tNow[y]; delete [] tNext[y]; } delete pBitmap3; delete pBitmap4; delete [] tNow; delete [] tNext; }RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
kikikaka
一般會員 發表:32 回覆:28 積分:12 註冊:2003-09-26 發送簡訊給我 |
|
kikikaka
一般會員 發表:32 回覆:28 積分:12 註冊:2003-09-26 發送簡訊給我 |
不好意思,才剛結案,又想到一個相關問題,請各位高手解惑!
想請問以下兩種寫法的差異,以及在釋放記憶體方面,是否有何不同?
謝謝各位幫忙! 1.
byte **ptr1; Graphics::TBitmap *pBitmap1=new Graphics::TBitmap; pBitmap1->Assign(Image1->Picture->Bitmap); ptr1 = new byte*[pBitmap1->Height]; for (int y = 0; y < pBitmap1->Height; y ) { ptr1[y] = (Byte *)pBitmap1->ScanLine[y]; }2. byte **ptr2; Graphics::TBitmap *pBitmap2=new Graphics::TBitmap; pBitmap2->Assign(Image2->Picture->Bitmap); ptr2 = new byte*[pBitmap2->Height]; for (int y = 0; y < pBitmap2->Height; y ) { ptr2[y] = new byte[pBitmap2->Width]; } |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
引言: 不好意思,才剛結案,又想到一個相關問題,請各位高手解惑! 想請問以下兩種寫法的差異,以及在釋放記憶體方面,是否有何不同? 謝謝各位幫忙! 1.RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====#####byte **ptr1; Graphics::TBitmap *pBitmap1=new Graphics::TBitmap; pBitmap1->Assign(Image1->Picture->Bitmap); ptr1 = new byte*[pBitmap1->Height]; for (int y = 0; y < pBitmap1->Height; y ) { ptr1[y] = (Byte *)pBitmap1->ScanLine[y]; } //ptr1指向一個大小為pBitmap1->Height,型態是byte*的動態陣列, 同時它的每一個元素分別指向某一已經存在的記憶體區塊,所以 最後需要釋放的記憶體: delete [] ptr1;2.byte **ptr2; Graphics::TBitmap *pBitmap2=new Graphics::TBitmap; pBitmap2->Assign(Image2->Picture->Bitmap); ptr2 = new byte*[pBitmap2->Height]; for (int y = 0; y < pBitmap2->Height; y ) { ptr2[y] = new byte[pBitmap2->Width]; } //ptr2指向一個大小為pBitmap2->Height,型態是byte*的動態陣列, 同時它的每一個元素分別又指向動態配置的記憶體區塊(原先不存在), 所以,最後需要釋放的記憶體: for (int y = 0; y < pBitmap2->Height; y ) { delete [] ptr2[y]; } delete [] ptr2; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |