2014-03-05 106 views
4

我有這樣的問題:調試斷言失敗_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)

調試斷言失敗!

文件:F:\ DD \ vctools \ crt_bld \ self_x86 \ CRT \ dbgdel.cpp

線52

表達」 _BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)

我的程序返回的所有值正確地給我很期待,但這個問題 讓我緊張的畫面......

#include <iostream> 
#include <cstdlib> 
#include <iomanip> 


using namespace std; 

double * wsk1; 
double * wsk2; 
double * wsk3; 
double * kopiowanie(double *wsk1,double *wsk2, double *wsk3); 
double * zaladuj(double *wsk1,double*wsk2); 
int main() 
{ 
    wsk1 = new double [30]; // tak inicjalizuje sie dynamicznie tablice 
    wsk2 = new double [30]; 
    wsk3= new double [30]; 
    zaladuj(wsk1,wsk2); 
    kopiowanie(wsk1,wsk2,wsk3); 
    for (int i=0;i<30;i++) 
    { 
     cout << setw(10) << *wsk1 << setw(10) << *wsk2 << setw(10) << *wsk3 << endl; 
     wsk1++; 
     wsk2++; 
     wsk3++; 
    } 
    wsk1 -=29; 
    wsk2 -=29; 
    wsk3 -=29; 


    delete[] wsk1; 
    delete[] wsk2; 
    delete[] wsk3; 

    system("pause"); 
} 

double * zaladuj(double * wsk1, double * wsk2) 
{ 

     for(int i=0;i < 30;i++) 
     { 
      *wsk1 = i; 
      *wsk2 = i; 
      wsk1++; 
      wsk2++; 
     } 
     wsk1 -=29 ; 
     wsk2 -= 29; 

     return wsk1, wsk2; 

} 

double * kopiowanie(double *wsk1,double*wsk2, double*wsk3) 
{ 
     for(int i=0; i<30;i++) 
     { 
      *wsk3 = (*wsk1) * (*wsk2); 
      wsk3++; 
      wsk2++; 
      wsk1++; 
     } 
     wsk1 -=29; 
     wsk2 -=29; 
     wsk3 -=29; 
     return wsk1,wsk2,wsk3; 
} 
+2

所有這些指針使_me_緊張。 –

+0

據我所知,所有你想要的是由'std :: iota'操作的兩個數組,然後另一個由'std :: transform'操作,它將其他兩個元素相乘。絲毫不需要指針或全局變量。 – chris

+2

這應該完成什麼? '返回wsk1,wsk2;'和這個? '返回wsk1,wsk2,wsk3;'小心解釋一下你的代碼意圖是什麼? – PaulMcKenzie

回答

5

這是一個內存破壞錯誤,它發生因爲你是delete ing事情你沒有new

這段代碼是錯誤的:

wsk1 -=29; 
wsk2 -=29; 
wsk3 -=29; 

你有三十循環迭代,這意味着30來電++,這意味着你需要-= 30也。

當你弄錯了,你傳遞給delete的指針是不正確的。

此外,return wsk1, wsk2;不會做你認爲它的作用,而不是你正在使用這些函數的返回值。

0

軌道上的輕度跑道說,你計算的是「舊」指針錯誤。

原則上,當您分配某些內容(使用new,malloc或其他某種方法)時,最好不要修改「原始指針」。做一個副本,而不是工作。或者在這種情況下,如果您使用索引變量,例如,您可能會從編譯器中獲得更好的代碼。 wsk1[i]而不是wsk1++,以達到您想要的程度。因爲你在本地拷貝上操作(但是,你可以使用[i]來代替索引,這樣做會有同樣的意義)。在你的函數中,你嘗試重置指針,這是完全不必要的,因爲你在本地拷貝上操作(但是同樣,你可以用[i]來索引, ,真的)。

-1

我補充這是用來delocate他們在表中的「高度」的另一個指針和它所有的建議,從而非常感謝球員;)