我的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;
}
请使用调试器和/或Valgrind的缩小您的问题。这是太多的代码才能通过。 – Mat 2013-05-05 20:20:55
@Mat我确实使用了一个调试器,并将其缩小到了Matrix :: set方法,但是我包含了所有的代码以防万一它是必要的 - 但是你当然是对的 - 我将清理那些重要的parths – kaufmanu 2013-05-05 20:27:08
问题是你使用指针和动态分配。使用指针和动态分配编写正确的代码本质上是不可能的。改为使用'std :: vector'。 –
2013-05-05 20:30:36