作者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