2016-11-30 107 views
1

我已經創建了一個應該構建對稱toeplitz矩陣的類(see here)。在類的實現在這裏釋放對象錯誤校驗和 - 打印時發生錯誤

class toeplitz{ 
private: 
    int size; 
    double* matrix; 
public: 
    toeplitz(const double* array, const int dim){ 
     size = dim; 
     matrix = new double(size*size); 
     for(int i = 0; i < size; i++){ 
      for (int j = 0; j < size; j++){ 
       int index = std::abs(i - j); 
       matrix[i*size + j] = array[index]; 
      } 
     } 
    } 

    ~toeplitz(){ 
     delete[] matrix; 
    } 

    void print() const{ 
     //loop over rows 
     for (int i = 0; i < size; i++){ 
      //loop over colums 
      for (int j = 0; j < size; j++){ 
       double out = matrix[i*size + j]; 
       std::cout << std::setw(4) << out; 
      } 
     //start new line for each row 
     std::cout << "\n"; 
     } 
    } 

}; 

所示我看不出有什麼不對的,但是當我嘗試在一個簡單的測試功能使用,我得到的malloc錯誤。主要功能我已經是

int main(){ 
    double array[] = {0,1,1,2}; 
    int len = sizeof(array)/sizeof(array[0]); 
    std::cout<<"length of array " << len << std::endl; 
    toeplitz tp = toeplitz(array, len); 
    tp.print(); 
} 

它編譯和運行的時候我離開了tp.print()線,但是當我加入這行,我得到錯誤

test_toeplitz(8747,0x7fffdbee63c0) malloc: *** error for object 0x7fb119402788: 
incorrect checksum for 
freed object - object was probably modified after being freed. 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

我想不通爲什麼這是。我在這裏看過關於這個問題的其他問題,但我無法分辨它們與我所做的事情有何關係。據我所知,它與釋放雙重內存或試圖在釋放內存後修改內存有關,但我看不到我的代碼在做什麼。任何深入瞭解正在發生的事情將不勝感激。

+0

我要補充,偶爾它實際上運行正常,並且有時它會給出錯誤「段錯誤:11」而不是 – bigbadpiano

+0

***對象可能在被釋放後被修改。***我會研究那個.. – drescherjm

+0

***我應該添加,偶爾它實際上運行正常,並且有時它會給出錯誤「段錯誤:11」而不是***這是一個明確的未定義行爲指示。 – drescherjm

回答

3

你無意中發現經典:

matrix = new double(size*size); 

當你想做哪個分配的雙重價值size*size

matrix = new double[size*size]; 

分配適當大小的數組。所以你得到未定義的行爲。有時它的工作原理有時不取決於內存配置。

由於您使用C++,我建議你使用std::vector<double>或特徵矩陣模板,永遠落C數組(沒有更多的內存泄漏,沒有更多的失敗的分配,可能邊界檢查,只有好處)

+0

或甚至更好的矢量(是的是的我知道矢量不會改變大小,但嘿,它避免了手動內存管理!並且可能會拋出索引超出界限例外) – Borgleader

+0

使用矢量不保證使用'[]'運算符進行邊界檢查。你必須使用'vector :: at'來檢查邊界。但同意(並在編輯我的答案時,你評論) –

+0

是的,我知道它不是一個保證,這就是爲什麼我說可能。我*認爲* VS'實現已經聲明YMMV的這種效果。 ;)(不要擔心,你已經得到了我的快艇) – Borgleader

相關問題