Re: [問題] 堆積損毀 找不出問題出在哪
發生了一個跟之前版友類似的問題
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
05/01 17:42, 1F
推
05/01 17:47, , 2F
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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章