奇怪的access violation問題 |
答題得分者是:aftcast
|
chang1981
一般會員 發表:31 回覆:28 積分:11 註冊:2008-09-18 發送簡訊給我 |
小弟時在是傷透腦筋了 只好在這邊向各位前輩求助
最近我寫了一個需要動態配置三維陣列的程式 程式碼如下 [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下面去跑 也沒問題.. 實在是想破頭了 在這邊請大家救救我!!!!! 感恩!!!!!!! |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我猜重點在於沒初始化記憶體!
[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 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
嗯,不用客氣!
目前你貼的程式碼可能不是關鍵的地方?! … 此外, 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 |
chang1981
一般會員 發表:31 回覆:28 積分:11 註冊:2008-09-18 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我剛外出去買東西吃,順便走走,發現…
你的問題很可能是 radius 這個變數搞鬼! 順便cx,和cy的值都查一下。 你會在debug時使用watch嗎? 設中斷在vote[Cx][Cy][radius] ,然後查看這些值,看是否超過了你建立的維度。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
chang1981
一般會員 發表:31 回覆:28 積分:11 註冊:2008-09-18 發送簡訊給我 |
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大幫忙!!!!! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |