全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1361
推到 Plurk!
推到 Facebook!

奇怪的access violation問題

答題得分者是:aftcast
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-11-26 11:47:23 IP:61.230.xxx.xxx 訂閱
小弟時在是傷透腦筋了 只好在這邊向各位前輩求助
最近我寫了一個需要動態配置三維陣列的程式
程式碼如下

[code cpp]
//*********************建立動態三維陣列vote[max_a][max_b][max_r]
short ***vote = new short**[max_a];
for(x=0;x {
vote[x] = new short*[max_b];
for(y=0;y {
vote[x][y] = new short[max_r];
}
}

//****************開始對vote進行處理,依照某些標準再對應的位置 ,就這麼簡單
int cnt=0;
if(!have) return(GoldenBitmap);//尚無任何節點(此影像是空白影像)

current = head;//將檢查指標指向鍊節陣列頭
int debug=0;
bool debugbool =false;

while(current!=NULL)//進行所有點的圓心投票表決
{
for(Cy=min_radius;Cy {
for(Cx=min_radius;Cx {
z = (current->x-Cx)*(current->x-Cx) (current->y-Cy)*(current->y-Cy);
radius = sqrt(z);
if(radius<=max_r)
{
vote[Cx][Cy][radius] ;//******關鍵就在於這一行,此行拿掉 程式就不會有錯
}
}
}
current = current->next;
debug ;
cnt ;
}

//***********************************************處理完畢要釋放vote的記憶體
for(x=0;x {
for(y=0;y {
delete [] vote[x][y];
vote[x][y]=NULL; //************釋放到一半 會在這邊出現錯誤 此時X=7 y=8
}
delete [] vote[x];
vote[x]=NULL;
}
delete [] vote;
vote=NULL;
return(GoldenBitmap);



[/code]

以上程式 只要不拿掉vote[Cx][Cy][radius] ; 這一行,就會在第二次call進來的時候錯在釋放記憶體的地方, 如果我將釋放記憶體的那段拿掉 直接回傳return(GoldenBitmap); 那傳回去後只要assign這個GoldenBitmap就會一樣出現access violation, 奇怪的是如果拿掉vote[Cx][Cy][radius] ; 就完全不會有問題, 但是這一行只是對已經new出來的空間作處理而已, 不知道為什麼會因為他造成 access violation..... , 另外就是我把這段程式放到VC下面去跑 也沒問題.. 實在是想破頭了
在這邊請大家救救我!!!!! 感恩!!!!!!!



編輯記錄
chang1981 重新編輯於 2008-11-26 11:48:40, 註解 無‧
chang1981 重新編輯於 2008-11-26 11:49:14, 註解 無‧
chang1981 重新編輯於 2008-11-26 11:50:25, 註解 無‧
chang1981 重新編輯於 2008-11-26 11:50:26, 註解 無‧
chang1981 重新編輯於 2008-11-26 11:51:20, 註解 無‧
chang1981 重新編輯於 2008-11-26 11:51:47, 註解 無‧
chang1981 重新編輯於 2008-11-26 11:52:30, 註解 無‧
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-11-26 13:32:53 IP:122.120.xxx.xxx 訂閱
我猜重點在於沒初始化記憶體!

[code cpp]
for(y=0;y {
vote[x][y] = new short[max_r];
::ZeroMemory(vote[x][y], sizeof(short)*max_r) //加入這一行
}
[/code]


vc 在new的時候可能"剛好"或是"用心"的把空間設為0,但嚴格的寫法還是要自己清為0
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-11-26 13:41:32, 註解 無‧
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-11-26 13:57:15 IP:61.230.xxx.xxx 訂閱
感謝A大 每次都是您來救命 只是我剛剛試了一下 似乎問題仍然是存在的 目前正在繼續嘗試當中~ 感謝!!!!
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-11-26 14:14:55 IP:122.120.xxx.xxx 訂閱
嗯,不用客氣! 

目前你貼的程式碼可能不是關鍵的地方?! …

此外, vote[x][y]=NULL; 這類的

要不要試看看先不要自己null 讓它自動的被釋放。 (我了解是你怕它變成野指標,這是很好的寫作風格,但若某些情形在bcb裡會怪怪的,這是我的經驗。反正你是不會在function結束前白痴的再使用release的地方,故null也是可以不管的,讓它自然在離開function時被release就可以)
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-11-26 14:20:18, 註解 無‧
aftcast 重新編輯於 2008-11-26 14:20:38, 註解 無‧
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-11-26 14:30:32 IP:61.230.xxx.xxx 訂閱
我的元件是用 Image

呼叫以上這之程式的那一行 是長這樣的 紅色的地方就是呼叫的地方
while(某種條件)
{
show_Bitmapa->Assign(g_Bitmap)
經過處理後的新影像 然後再assign到show_Bitmapa這個bitmap當中, 第一次跑過去是成功的
但是當while迴圈跑第二次就會出現我前面提到的問題了
神奇的式 如果把前面我說的那一行 vote[][][] 拿掉, 就一切正常........
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-11-26 15:30:32 IP:60.248.xxx.xxx 訂閱
我剛外出去買東西吃,順便走走,發現…

你的問題很可能是 radius 這個變數搞鬼! 順便cx,和cy的值都查一下。

你會在debug時使用watch嗎? 設中斷在
vote[Cx][Cy][radius] ,然後查看這些值,看是否超過了你建立的維度。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2008-11-26 15:32:02, 註解 無‧
aftcast 重新編輯於 2008-11-26 15:33:12, 註解 無‧
chang1981
一般會員


發表:31
回覆:28
積分:11
註冊:2008-09-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-11-26 16:09:49 IP:61.230.xxx.xxx 訂閱
A大我應該是找到問題所在了
的確是您所說的維度大小的問題
因為我是用for 迴圈宣告動態陣列

for(x=0;x {
vote[x] = new short*[max_b];
for(y=0;y {
vote[x][y] = new short[max_r];
for(int q=0;q {
vote[x][y][q]=0;
}
}
}

所以每當i=max_a時 我都會再多宣告一格
因此我本來想要的陣列大小是 vote[max_a][max_b][max_r]
但最後卻宣告成 vote[max_a 1][max_b 1][max_r 1]
我想是因為這樣的原因 造成我後續程式判斷上出現了問題
目前在這方面做修改後問題已經解決
如果後須還有發現確實的原因我會在補上的
感謝A大幫忙!!!!!
編輯記錄
chang1981 重新編輯於 2008-11-26 16:16:14, 註解 無‧
chang1981 重新編輯於 2008-11-26 16:18:19, 註解 無‧
chang1981 重新編輯於 2008-11-26 16:22:40, 註解 無‧
系統時間:2024-05-07 18:26:26
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!