[問題] new/delete

作者: amy10062003 (徘徊在抉擇之間)   2014-05-26 20:23:08
開發平台(Platform):
VC++
額外使用到的函數庫(Library Used):
問題(Question):
1. Memory leak
2. Memory 不同
(1) VTX* pVTXData = new VTX[2000];
(2) for(int i = 0 ; i < 100 ; i++)
{
VTX* pVTXData = new VTX[20];
}
都是2000筆資料 為什麼測出來的Memory會不同呢?
餵入的資料(Input):
Structure pointer
預期的正確結果(Expected Output):
New出來的Memory要全被放掉
錯誤結果(Wrong Output):
只放掉部分
程式碼(Code):(請善用置底文網頁, 記得排版)
struct VTX
{
float fPos[3];
float fAlpha;
float fMappingU;
...
}
struct AFrame
{
VTX* pVtx;
}
開始allocate
int nFrameCount = 1000; // 有1000 frames
int nVTXCount = 20; // 有20個 vtx
AFrame* pFrame = new AFrame[nFrameCount];
for(int i = 0 ; i < nVTXCount; i++)
{
pFrame[i].pVtx = new VTX[nVTXCount]; // 每一個frame去new出固定量的VTX
}
執行完準備delete
for(int i = 0 ; i < nFrameCount; i++)
{
delete pFrame[i].pVtx;//每一個frame將他的pVtx放掉(但其實有20個 希望可把20個全刪)
}
補充說明(Supplement):X
概念上是長成像以下的結構
然後最後再全部release
pFrame[0].pVtx[0], pFrame[0].pVTX[1], ... pFrame[0].pVTX[20]
pFrame[1].pVtx[0], pFrame[1].pVTX[1], ... pFrame[1].pVTX[20]
pFrame[2].pVtx[0], pFrame[2].pVTX[1], ... pFrame[2].pVTX[20]
...
pFrame[999].pVtx[0], pFrame[999].pVTX[1], ... pFrame[999].pVTX[20]
有試過delete AFrame[i].pVtx[0]但會顯示
Cannot convert from AFrame* to void*
謝謝!
作者: bibo9901 (function(){})()   2014-05-26 20:29:00
照你的意思應該直接寫 delete[] pFrame 就好
作者: bibo9901 (function(){})()   2014-05-26 20:30:00
不是放到迴圈裡
作者: Feis (永遠睡不著 @@)   2014-05-26 21:51:00
怎麼 new 就怎麼 delete => delete[] pFrame;delete [] pVtx;
作者: amy10062003 (徘徊在抉擇之間)   2014-05-27 09:30:00
抱歉 因為上面第二個參數是迴圈動態產生 有改了一下
作者: amy10062003 (徘徊在抉擇之間)   2014-05-27 09:31:00
主要是問pVtx這一個參數怎麼delete比較好? for嗎?
作者: LPH66 (-6.2598534e+18f)   2014-05-27 10:23:00
三樓回你了, delete[] pVtx; 如果你是要問所有的話當然要for
作者: amy10062003 (徘徊在抉擇之間)   2014-05-27 11:16:00
delete [] pFrame[i].pVtx?若pVtx不只一個 這樣有刪?
作者: LPH66 (-6.2598534e+18f)   2014-05-27 11:36:00
所以才說如果你是要問全部的 pVtx 當然需要 for
作者: LPH66 (-6.2598534e+18f)   2014-05-27 11:37:00
這裡並沒有什麼比較好的問題, 基本上你就是得要這麼做
作者: amy10062003 (徘徊在抉擇之間)   2014-05-27 13:07:00
不過delete AFrame[i].pVtx[0]就會出現cannot convert
作者: amy10062003 (徘徊在抉擇之間)   2014-05-27 13:08:00
from CFrame* to void*的情形
作者: iamnotgm (伽藍之黑)   2014-05-27 21:15:00
delete [] AFrame[i].pVtx[0]
作者: amy10062003 (徘徊在抉擇之間)   2014-05-28 09:49:00
這樣寫會出現不能轉換成void*的訊息
作者: LPH66 (-6.2598534e+18f)   2014-05-28 11:50:00
把完整程式放上來吧, 你的推文跟原文程式似乎有點對不上...
作者: amy10062003 (徘徊在抉擇之間)   2014-05-28 13:26:00
有再更新一下 謝謝!
作者: CaptainH (Cannon)   2014-05-28 21:32:00
推 "怎麼 new 就怎麼 delete"你要在迴圈裡 delete[] pFrame[i].pVtx再 delete pFrame
作者: amy10062003 (徘徊在抉擇之間)   2014-05-29 11:03:00
好 謝謝大家!

Links booklink

Contact Us: admin [ a t ] ucptt.com