2016-11-30 92 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

相关问题