[问题] 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