Re: [問題] 堆積損毀 找不出問題出在哪

看板C_and_CPP (C/C++)作者 (魯)時間14年前 (2011/05/01 17:40), 編輯推噓1(103)
留言4則, 3人參與, 最新討論串2/2 (看更多)
發生了一個跟之前版友類似的問題 compiler:VS2008 programming:C 我要free一個pointer時 他就跑出 "Windows 已觸發 hw3.exe 內的中斷點。 可能是因為堆積損毀,表示 hw3.exe 內有錯誤或其載入的任何 DLL 內有錯誤。 也有可能是因為 hw3.exe 取得焦點時使用者按下 F12。 輸出視窗或許有較多的診斷資料。" 這樣的訊息 之後他就跑出反組譯碼 ... 770D541D mov eax,dword ptr [ebp+8] 770D5420 mov byte ptr ds:[770F004Dh],1 770D5427 mov dword ptr ds:[770F0048h],eax 770D542C int 3 <-(指著這行) 770D542D mov byte ptr ds:[770F004Dh],0 770D5434 pop ebp 770D5435 ret 4 ... 附上我出錯部分的code: (簡單來說就是用牛頓法求N階legendre多項式的N的根而已) double *FindAllRoots(double *l,int n) //total n roots { double *r,*a,*b; double guess,c,d; int i,j,maxN,sym; r=malloc(n*sizeof(double)); a=malloc(n*sizeof(double)); b=malloc(n*sizeof(double)); sym=0; guess=0; for(i=0;i<=n;i++) a[i]=l[i]; for(i=0;i<n;i++){ maxN=n-i; if(guess==0) guess=0.1; else if(sym==0) {guess=-guess;sym=1;} else if(sym==1) {guess=0.1;sym=0;} //find each root using Newton Method do{ d=b[maxN]=a[maxN]; for(j=maxN-1;j>=0;j--) b[j]=a[j]+b[j+1]*guess; for(j=maxN-1;j>=1;j--) d=b[j]+d*guess; guess=guess-b[0]/d; if(guess>1) guess=1; if(guess<-1) guess=-1; }while(absolute(b[0])>ERROR); //check the root do{ c=l[n]; d=l[n]*n; for(j=n-1;j>=0;j--) c=l[j]+c*guess; for(j=n-1;j>=1;j--) d=l[j]*j+d*guess; guess=guess-c/d; }while(absolute(c)>ERROR); b[maxN]=a[maxN]; for(j=maxN-1;j>=0;j--) b[j]=a[j]+b[j+1]*guess; r[i]=guess; for(j=maxN;j>=0;j--) a[j-1]=b[j]; } free(b); free(a); 沒這兩行就沒錯了...是也可以不理它啦... printf("\n\n"); for(i=0;i<n;i++) printf(" %21.18f \n",r[i]); return r; } 希望版上高手幫我看看 謝謝 ※ 引述《dreamboat66 (小嫩)》之銘言: : 我delete 掉一個我new出來的空間時 : 他會觸發一個 錯誤 : 訊息是下面這樣... : ======================================================================== : Windows 已觸發 X.exe 內的中斷點。 : 可能是因為堆積損毀,表示 X.exe 內有錯誤或其載入的任 : 何 DLL 內有錯誤。 : 也有可能是因為 X.exe 取得焦點時使用者按下 F12。 : 輸出視窗或許有較多的診斷資料。 : ======================================================================== : 停在 : free.c的 : #endif /* _WIN64 */ : { : retval = HeapFree(_crtheap, 0, pBlock); <=========這行... : 如果按繼續 : 他就會出現 : expression:_CrtIsValidHeapPointer~~ : google一下 說是delete到 一個根本沒new東西的指標 : 可是我應該都有new阿 @@ : 我測試這個delete 沒new的指標 : 是停在_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)); : 問題應該不是出在這@@ : 我trace了好久的時間 : 我對這指標指到的結構 沒有做任何更動 : 程式突然發現會出現這個錯誤 之前delete這指標都沒有事情........ : 想請教問題大概出在哪裡?? : 請經驗豐富的版友可否提供我一些線索... : 本來想說是程式結束才會壞 乾脆算了 但實在很想找出問題@@ : 謝謝各位 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.200

05/01 17:42, , 1F
對了 我程式其他部分也有用free(); 但是都沒事就是了...
05/01 17:42, 1F

05/01 17:47, , 2F
i=0 時 maxN=n,j=maxN-1 時 b[j+1]=b[n] 超過了
05/01 17:47, 2F

05/01 18:36, , 3F
通常這種問題都是存取越界
05/01 18:36, 3F

05/01 18:51, , 4F
感謝!! 都沒有養成檢查的習慣= =
05/01 18:51, 4F
文章代碼(AID): #1DlIgdHt (C_and_CPP)
文章代碼(AID): #1DlIgdHt (C_and_CPP)