2012-10-20 42 views
0

當用該析構函數刪除多維矩陣:錯誤刪除多維矩陣

matrix::~matrix(){ 
    int i; 
    for(i=0;i<n;i++){ 
     delete[] user_matrix[i];} 
    delete[] user_matrix;} 

我恢復這樣的錯誤:

*** glibc detected *** ./a.out: free(): invalid pointer: 0x00007fdb33067778 *** 
======= Backtrace: ========= 
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fdb32d2db96] 
./a.out[0x40157c] 
./a.out[0x40172b] 
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fdb32cd076d] 
./a.out[0x400b09] 

隨之而來的是「存儲器映象」。當我通過Valgrind的運行它,它表明,有在操作過載爲*錯誤:

matrix matrix::operator* (matrix param) { 
    //n is the size of the square matrix 
    if(n!=param.n){ 
    //returns an empty matrix if they are not of equal size 
    matrix blah; 
    return blah;} 
    //initiates a nxn matrix that is empty 
    matrix temp(n,0); 
    temp.user_matrix=matrix_mult(user_matrix,param.user_matrix); 
    return temp;} 

這符合析構函數被調用,也與析構函數註釋掉運行,直到計算機內存用完或者計算足夠小並結束。

#include"matrix.h" 
using namespace std; 

matrix::matrix(int n1,int initiate){ 
    srand(3534.34535); 
    n=n1; 
    //float** user_matrix 
    user_matrix=new float* [n]; 
    int i; 
    for(i=0;i<n;i++){ 
    user_matrix[i]=new float [n];} 

    if(initiate==1){ 

    int j; 
    for(i=0;i<n;i++){ 

    for(j=0;j<n;j++){ 

     cout<<"please ["<<i<<"]["<<j<<"]"<<endl; 

     cin>>user_matrix[j][i];} 
    } 
    }else if(initiate==2){ 
    user_matrix=random_matrix(n);} 

} 

float** matrix::inverse(){ 
    int i,k; 
    float sub_det,detin; 

    detin=det(); 

    if(detin==0){cout<<"uninvertable"<<endl;}; 

    float** inverse = new float* [n]; 
    for(i=0;i<n;i++){ 
    inverse[i]=new float [n];} 

    float invertdet=1.0/detin; 

    for(i=0;i<n;i++){ 
    for(k=0;k<n;k++){ 
     inverse[k][i]=invertdet*pow(-1,i+k)*determinant(sub_matrix(user_matrix,i,k,n),n-1); 
    } 
    } 

    return inverse;} 

void matrix::display(){ 
    //cout<<"lol"<<endl<<n<<endl; 
    int i,j; 
    cout.precision(5); 
    for(j=0;j<n;j++){ 
    cout<<"|"; 
    for(i=0;i<n;i++){ 

     cout<<user_matrix[i][j]<<" ";};cout<<"|"; 
    cout<<endl<<endl;} 
    cout<<endl<<endl; 
} 

float matrix::determinant(float** matrix,int n1){ 
    if(n1==1){return matrix[0][0];} 
    int i; 
    float det1=0; 
    i=0; 
    for(i=0;i<n1;i++){  
    float** temp_matrix=sub_matrix(matrix,i,0,n1); 
    det1 = det1 + pow(-1.0,i)*matrix[i][0]*determinant(temp_matrix,n1-1); 
    int j=0; 
    for(j=0;j<n1-1;j++){delete[] temp_matrix[j];} 
    delete[] temp_matrix; 
    } 
    return det1;} 

float matrix::det(){return determinant(user_matrix,n);} 




float** matrix::sub_matrix(float** matrix,int colum,int row,int n){ 
    float **sub_matrix=new float *[n-1]; 
    int iter; 

    for(iter=0;iter<(n-1);iter++){ 
    sub_matrix[iter]=new float [n-1];} 
    int iter2; 
    int placeholder1,placeholder2; 

    placeholder1=placeholder2=0; 

    for(iter=0;iter<n;iter++){ 

    if(iter==colum){continue;} 
    placeholder2=0; 
    for(iter2=0;iter2<n;iter2++){ 
     if(iter2==row){continue;} 
     sub_matrix[placeholder1][placeholder2]=matrix[iter][iter2]; 
     placeholder2++; 
    } 
    placeholder1++; 

    } 

    return sub_matrix;} 

float** matrix::random_matrix(int n){ 

    int i,j; 
    float** temp_mat=new float* [n]; 
    for(i=0;i<n;i++){ 
    temp_mat[i]=new float [n];} 

    for(i=0;i<n;i++){ 
    for(j=0;j<n;j++){ 
     temp_mat[i][j]=rand()%10 +1;} 
    } 
    return temp_mat;} 

float** matrix::matrix_mult(float** matrix1,float** matrix2){ 
    int i,j,k; 
    float subresult; 
    float** ret_mat; 
    ret_mat=new float* [n]; 
    for(i=0;i<n;i++){ 
    ret_mat[i]=new float [n];} 
    for(i=0;i<n;i++){ 
    for(j=0;j<n;j++){ 

     for(k=0;k<n;k++){ 
    subresult=subresult + matrix1[k][i]*matrix2[j][k]; 
     } 
     ret_mat[i][j]=subresult;} 
    } 
    return ret_mat;} 
matrix::~matrix(){ 
    int i;for(i=0;i<n;i++){delete[] user_matrix[i];};delete[] user_matrix;} 

matrix matrix::operator* (matrix param) { 
    if(n!=param.n){ 
    matrix blah; 
    return blah;} 

    matrix temp(n,0); 
    temp.user_matrix=matrix_mult(user_matrix,param.user_matrix); 
    return temp;} 

int main(){ 
    int i; 
    /*for(i=1;i<20;i++){ 
    matrix m1(i,2); 
    cout<<i<<" "<<m1.det()<<endl;}*/ 
    matrix m1(16,2),m2(16,2),m3(16,0); 
    for(i=0;i<100000;i++){m3=m1*m2;} 


return 0;} 

代碼沒有非錯誤導致的功能。

#include"matrix.h" 
using namespace std; 

matrix::matrix(int n1,int initiate){ 
    srand(3534.34535); 
    n=n1; 
    //float** user_matrix 
    user_matrix=new float* [n]; 
    int i; 
    for(i=0;i<n;i++){ 
    user_matrix[i]=new float [n];} 

    if(initiate==1){ 

    int j; 
    for(i=0;i<n;i++){ 

    for(j=0;j<n;j++){ 

     cout<<"please ["<<i<<"]["<<j<<"]"<<endl; 

     cin>>user_matrix[j][i];} 
    } 
    }else if(initiate==2){ 
    user_matrix=random_matrix(n);} 

} 

float** matrix::random_matrix(int n){ 

    int i,j; 
    float** temp_mat=new float* [n]; 
    for(i=0;i<n;i++){ 
    temp_mat[i]=new float [n];} 

    for(i=0;i<n;i++){ 
    for(j=0;j<n;j++){ 
     temp_mat[i][j]=rand()%10 +1;} 
    } 
    return temp_mat;} 

float** matrix::matrix_mult(float** matrix1,float** matrix2){ 
    int i,j,k; 
    float subresult; 
    float** ret_mat; 
    ret_mat=new float* [n]; 
    for(i=0;i<n;i++){ 
    ret_mat[i]=new float [n];} 
    for(i=0;i<n;i++){ 
    for(j=0;j<n;j++){ 

     for(k=0;k<n;k++){ 
    subresult=subresult + matrix1[k][i]*matrix2[j][k]; 
     } 
     ret_mat[i][j]=subresult;} 
    } 
    return ret_mat;} 
matrix::~matrix(){ 
    int i;for(i=0;i<n;i++){delete[] user_matrix[i];};delete[] user_matrix;} 

matrix matrix::operator* (matrix param) { 
    if(n!=param.n){ 
    matrix blah; 
    return blah;} 

    matrix temp(n,0); 
    temp.user_matrix=matrix_mult(user_matrix,param.user_matrix); 
    return temp;} 

matrix & matrix::operator= (const matrix & param) 
{ 
    int i,j; 
    float** new_array=new float* [param.n]; 
    for(i=0;i<param.n;i++){ 
    new_array[i]=new float [param.n];} 
    for(i=0;i<param.n;i++){ 
    for(j=0;j<param.n;j++){ 
     new_array[i][j]=param.user_matrix[i][j];} 
    } 

    for(i=0;i<param.n;i++){ 
    delete[] user_matrix[i];} 
    delete[] user_matrix; 
    user_matrix=new_array; 
    n=param.n; 
    return *this; 

} 

int main(){ 
    int i; 
    matrix m1(16,2),m2(16,2),m3(16,0); 
    for(i=0;i<100000;i++){m3=m1*m2;} 


return 0;} 
+0

顯示爲類或至少數據成員的完整代碼和[]等 是否定義了這個類拷貝構造函數和賦值運算符重載任何操作? – Pete

+0

錯誤定義的複製構造函數是此錯誤最可能的解釋。但是你沒有向我們展示拷貝構造函數。請發佈全班。 – john

回答

0

沒有看到更多的代碼,我只能猜測,你可能

  • 沒有一個正確的拷貝構造函數,所以user_matrix指針被複制,或者
  • 默認構造函數不初始化成員user_matrix或
  • matrix_mult返回一個無效指針。

但至少有一件事是錯誤的。 temp.user_matrix在temp.user_matrix =之前被刪除...

+0

「temp.user_matrix在temp.user_matrix =」之前被刪除「如何? – user1750289

1

當你有一個分配內存的對象時,只需要注意如何複製該對象。你需要定義一個拷貝構造函數和一個賦值運算符,它們根據對象分配的內存來做正確的事情。否則,在刪除對象時會出錯,通常是因爲最終刪除了兩次相同的內存。

您似乎沒有定義複製構造函數或賦值運算符。當你定義一個析構函數時,你幾乎總是需要定義一個拷貝構造函數和一個賦值操作符。這被稱爲「三條規則」。你可以在這裏看看如何做到這一點的指導(或者只是閱讀一本好的C++書)。

What is The Rule of Three?

+0

定義了一個拷貝構造函數之後,我得到了同樣的錯誤,但valgrind現在說錯誤在析構函數中。 – user1750289

+0

好,以幫助解決這個問題,我真的需要看到一個完整的程序。你可以減少你的代碼到**最小的可能版本**,仍然有錯誤,然後發佈整個代碼。或者,如果您不確定您的拷貝構造函數是否正確,那麼您可以將其發佈。如果你確定已經被告知了這一點,但人們說使用std :: vector而不是自己分配內存的原因是,正如你發現的那樣,做你自己的內存分配是很困難的。 – john

+0

已發佈可能包含錯誤的代碼。 – user1750289