2013-05-05 79 views
2

我的C++程序(处理一些计算与矩阵,参见下面的文件)崩溃与下面的消息:运行时错误的C++程序:检测的glibc,munmap_chunk(),无效指针

*** glibc的检测** * ./matrix:munmap_chunk():无效指针:0x08bfd068 ***

其次是回溯和内存映射。当我第一次在Matrix-class中调用set-Method时会发生这种情况 - 但我不知道我在做什么错误......每一个帮助(以及改进我的代码的一般提示)都非常感谢!

Array.cpp

#include <iostream> 
#include <stdlib.h> 
#include <string.h> 
#include "Array.h" 

using namespace std; 

Array::Array(){ 
    Array(10); 
} 

Array::Array(int size){ 
    data = new int[size]; 
    memset(data, 0, sizeof(data)); 
    length = size; 
} 

Array::~Array(){ 
    delete [] data; 
} 

void Array::set(int pos, int value){ 
    if(pos < 0) pos = 0; 
    if(pos >= length) pos = length-1; 
    *(data + pos) = value; 
} 

int Array::get(int pos){ 
    if(pos < 0) pos = 0; 
    if(pos >= length) pos = length-1; 
    return *(data + pos); 
} 

void Array::print(){ 
    for(int i = 0; i < length; i++){ 
     cout << *(data + i) << "\t"; 
    } 
    cout << endl; 
    return; 
} 

/*works only for arrays of length 9*/ 
int Array::find_max(int data[]){ 
    int max = data[0]; 

    for(int i = 1; i < 9; i++){ 
     if(data[i] > max) max = data[i]; 
    } 

    return max; 
} 

Matrix.h

#ifndef MATRIX_H 
#define MATRIX_H 
#include "Array.h" 

class Matrix{ 

    private: 
     Array * data; 
     int height; 
     int width; 

    public: 
     Matrix(); 
     ... 
}; 

#endif 

Matrix.cpp

#include <iostream> 
#include <stdlib.h> 
#include <string.h> 
#include "Matrix.h" 

using namespace std; 

Matrix::Matrix(){ 
    Matrix(10, 10); 
} 

Matrix::Matrix(int h, int w){ 
    height = h; 
    width = w; 

    data = new Array(height); 

    for(int i = 0; i < height; i++){ 
     *(data + i) = *(new Array(width)); 
    } 

} 

Matrix::~Matrix(){ 
    for(int i = 0; i < height; i++){ 
     Array * row = (data + i); 
     delete row; 
    } 

    delete data; 
} 

void Matrix::set(int h, int w, int value){ 
    Array row = *(data + h); 
    row.set(w, value); 
} 

... 

main.cpp中

#include <iostream> 
#include <stdlib.h> 
#include <string.h> 
#include "Array.h" 
#include "Matrix.h" 

using namespace std; 

int main(int argc, char** argv){ 
    if(argc != 3){ 
     cout << "usage: " << argv[0] << " <m> x <n>" << endl; 
     exit(-1); 
    } 

    int m = atoi(argv[1]); 
    int n = atoi(argv[2]); 

    Matrix * myMatrix = new Matrix(m, n); 

    /*fill matrix randomly*/ 
    int guess, minus; 
    srand(time(NULL)); 

    for(int r = 0; r < m; r++){ 
     for(int c = 0; c < n; c++){ 
      guess = rand() % 1001; 
      minus = rand() % 2; 

      if(minus == 0) guess *= -1; 
      std::cout << " set " << c << ", " << r << " " << guess << std::endl; 
      myMatrix->set(r, c, guess); 

     } 
    } 

    ... 

    delete myMatrix; 
    ... 

    return 0; 
} 
+1

请使用调试器和/或Valgrind的缩小您的问题。这是太多的代码才能通过。 – Mat 2013-05-05 20:20:55

+0

@Mat我确实使用了一个调试器,并将其缩小到了Matrix :: set方法,但是我包含了所有的代码以防万一它是必要的 - 但是你当然是对的 - 我将清理那些重要的parths – kaufmanu 2013-05-05 20:27:08

+0

问题是你使用指针和动态分配。使用指针和动态分配编写正确的代码本质上是不可能的。改为使用'std :: vector '。 – 2013-05-05 20:30:36

回答

3
Matrix::Matrix(){ 
    Matrix(10, 10); 
} 

这不是做你认为它是。它只是创建一个临时矩阵并丢弃它。这意味着正在构建的矩阵的高度,宽度和数据没有初始化

我认为你的意图是要做和Matrix::Matrix(int h, int w)一样的事情。然而,你不能这样做。


如果你有C++ 11的支持,你可以使用delegated construction做同样的事情。

Matrix::Matrix() : // <- Notice the colon 
    Matrix(10, 10) 
{ 
} 

如果你没有C++ 11的支持你必须做手工

Matrix::Matrix(){ 
    height = 10; 
    width = 10; 

    data = new Array(height); 

    for(int i = 0; i < height; i++){ 
     *(data + i) = *(new Array(width)); 
    } 

} 

,或者可以创建另一个成员函数,它不常见的操作和调用,从两个构造函数。


​​

要复制的数组行中的一个新的Array还有一个问题叫做row您没有复制构造函数。所以指针的值是直接复制的。 函数返回row被销毁意味着row.data指向的内存也为deleted,这意味着矩阵中的数据也会受到影响,因为它指向的是同一个东西。见The rule of three

应该

Array* row = (data + h); 
row->set(w, value); 
+0

好的,谢谢!我解决了这个问题,但这不是问题,因为我总是在创建矩阵时指出矩阵的大小... – kaufmanu 2013-05-05 20:33:47

+0

@StringerBell请参阅编辑。而且你也有类似的问题,在'Array :: Array()'中的第一个问题; – stardust 2013-05-05 20:42:05

相关问题