作者NoobImage (老人家)
看板C_and_CPP
标题[问题] 副程式内动态矩阵值会爆掉吗??? 我这是什麽情形???
时间Mon Feb 9 17:53:45 2009
个人习惯把程式模组化
都使用副程式 或是 INCULDE .CPP
但是我今天碰到了一个严重问题 而我毫无头绪
--------------------问题------------------
我的副程式在第一次RUN都很正常
但是多RUN几次 所有值都乱掉
EX 我的矩阵里面的值只有 0跟1
但是多跑了以後会出现好几万
------------------个人观念----------------
就我所知 副程式内动态矩阵每次做完有DELETE的话
内容不会累积或是重叠 而且!!! 每做完一次副程式都会清空(释放)才对!!!
------------------------------------------
我想请问 是否是配置过多动态矩阵才此呢?
造成没有多的记忆体可用吗?
使用工具 BCB6 以下是范例
void xxx()
{
//宣告 总共有9组 二维动态阵列
//OriH = 150 OriW =200 SizeX=7 SizeY=7
float **Temp1,**Temp2,**GradientX,**GradientY ,**VectorX,**VectorY ,**Orientation;
int **Gray,**Cadidate;
Byte *ptr;
Graphics::TBitmap *TheBitmap=new Graphics::TBitmap;
TheBitmap->Assign(Form1->Image4->Picture->Bitmap);
OriW=TheBitmap->Width;
OriH=TheBitmap->Height;
Gray=new int*[OriH];
Temp1=new float*[OriH];
Temp2=new float*[OriH];
GradientX=new float*[OriH];
GradientY=new float*[OriH];
VectorX=new float*[OriH];
VectorY=new float*[OriH];
Orientation=new float*[OriH/SizeY];
Cadidate=new int*[OriH/SizeY];
for(int y=0;y<OriH/SizeY;y++)
{
Cadidate[y]=new int[OriW/SizeX];
Orientation[y]=new float[OriW/SizeX];
}
for(int y=0;y<OriH;y++)
{
Gray[y]=new int[OriW];
Temp1[y]=new float[OriW];
Temp2[y]=new float[OriW];
GradientX[y]=new float[OriW];
GradientY[y]=new float[OriW];
VectorX[y]=new float[OriW];
VectorY[y]=new float[OriW];
}
-----------------------------------------------------------------
程式内容...
...........
...........
-----------------------------------------------------------------
//清除
for(int y=0;y<OriH;y++)
{
delete []Gray[y];
delete []Temp1[y];
delete []Temp2[y];
delete []GradientX[y];
delete []GradientY[y];
delete []VectorX[y];
delete []VectorY[y];
}
for(int y=0;y<OriH/SizeY;y++)
{
delete []Orientation[y];
delete []Cadidate[y];
}
delete []Cadidate;
delete []Temp1;
delete []Temp2;
delete []GradientX;
delete []GradientY;
delete []VectorX;
delete []VectorY;
delete []Orientation;
delete []Gray;
delete TheBitmap;
}
除了Byte *ptr外
每一个都有删除
请问有人遇过如此诡异的问题吗????????
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.64.88.58
1F:推 chrisdar:拿VLD测测看吧 Visual Leak Detector 02/09 18:03
2F:→ NoobImage:我是用bcb没有那个 02/09 18:12
3F:推 chrisdar:拿VLD的SourceCode去BCB编编看 02/09 18:25
4F:→ NoobImage:我找找 02/09 18:26
5F:→ NoobImage:找到了 可惜...bcb不支援 02/09 18:47
6F:→ NoobImage:[Linker Error] 'C:\PROGRAM FILES\BORLAND\CBUILDER6\L 02/09 18:47
7F:→ NoobImage:IB\VLDMT.LIB' contains invalid OMF record, type 0x21 02/09 19:27
8F:→ NoobImage:有不支援的编码...$#%^##$@ 02/09 19:28
9F:推 chrisdar:要不然就人工模式抓memory Leak 02/09 19:37
10F:→ NoobImage:人工模式? 我不会 可以简单叙述一下吗? 02/09 19:39
11F:推 PcGrek:我以前写类似的code也是出错,改用STL就可以了。 02/09 20:19
12F:→ PcGrek:个人推测是compiler在 delete[] 时发生异常。 02/09 20:20
13F:→ PcGrek:有兴趣的话,也可以试试小弟前一篇文章提到的另一种 02/09 20:21
14F:→ PcGrek:二维空间的记忆体宣告方式。 02/09 20:21
15F:推 hugh3306:如果是要抓memory leak的话 bcb有code guard可以用 02/09 20:48
16F:→ NoobImage:PcGrek你太神了 你是正解 我的问题解决了 02/12 19:41
17F:推 PcGrek:之前也为此困扰很久,虽然後来用STL解决,倒没试过後来学 02/16 01:10
18F:→ PcGrek:的写法,很高兴能帮上忙,看来delete[]还是少用为妙 XD 02/16 01:14