[問題] new/delete

看板C_and_CPP作者 (徘徊在抉擇之間)時間10年前 (2014/05/26 20:23), 10年前編輯推噓3(3016)
留言19則, 6人參與, 最新討論串1/1
開發平台(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* 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.240.168.39 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1401106991.A.9EE.html ※ 編輯: amy10062003 (111.240.168.39), 05/26/2014 20:25:03

05/26 20:29, , 1F
照你的意思應該直接寫 delete[] pFrame 就好
05/26 20:29, 1F

05/26 20:30, , 2F
不是放到迴圈裡
05/26 20:30, 2F

05/26 21:51, , 3F
怎麼 new 就怎麼 delete => delete[] pFrame;delete [] pVtx;
05/26 21:51, 3F
※ 編輯: amy10062003 (118.163.84.235), 05/27/2014 09:30:13

05/27 09:30, , 4F
抱歉 因為上面第二個參數是迴圈動態產生 有改了一下
05/27 09:30, 4F

05/27 09:31, , 5F
主要是問pVtx這一個參數怎麼delete比較好? for嗎?
05/27 09:31, 5F

05/27 10:23, , 6F
三樓回你了, delete[] pVtx; 如果你是要問所有的話當然要for
05/27 10:23, 6F

05/27 11:16, , 7F
delete [] pFrame[i].pVtx?若pVtx不只一個 這樣有刪?
05/27 11:16, 7F

05/27 11:36, , 8F
所以才說如果你是要問全部的 pVtx 當然需要 for
05/27 11:36, 8F

05/27 11:37, , 9F
這裡並沒有什麼比較好的問題, 基本上你就是得要這麼做
05/27 11:37, 9F

05/27 13:07, , 10F
不過delete AFrame[i].pVtx[0]就會出現cannot convert
05/27 13:07, 10F

05/27 13:08, , 11F
from CFrame* to void*的情形
05/27 13:08, 11F

05/27 21:15, , 12F
delete [] AFrame[i].pVtx[0]
05/27 21:15, 12F

05/28 09:49, , 13F
這樣寫會出現不能轉換成void*的訊息
05/28 09:49, 13F

05/28 11:50, , 14F
把完整程式放上來吧, 你的推文跟原文程式似乎有點對不上...
05/28 11:50, 14F
※ 編輯: amy10062003 (118.163.84.235), 05/28/2014 13:25:42

05/28 13:26, , 15F
有再更新一下 謝謝!
05/28 13:26, 15F
※ 編輯: amy10062003 (118.163.84.235), 05/28/2014 14:17:50

05/28 21:32, , 16F
推 "怎麼 new 就怎麼 delete"
05/28 21:32, 16F

05/28 21:33, , 17F
你要在迴圈裡 delete[] pFrame[i].pVtx
05/28 21:33, 17F

05/28 21:34, , 18F
再 delete pFrame
05/28 21:34, 18F

05/29 11:03, , 19F
好 謝謝大家!
05/29 11:03, 19F
文章代碼(AID): #1JWp8ldk (C_and_CPP)