运行时错误C++程序:检测到glibc,munmap_chunk(),指针无效



我的C++程序(处理一些矩阵计算,请参阅下面的文件(崩溃,并显示以下消息:

***检测到glibc***/矩阵:munmap_chunk((:无效指针:0x08bfd068***

然后是回溯和内存映射。当我第一次调用Matrix类中的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;
}

矩阵.h

#ifndef MATRIX_H
#define MATRIX_H
#include "Array.h"
class Matrix{
    private:
        Array * data;
        int height;
        int width;
    public:
        Matrix();
        ...
};
#endif

矩阵.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;
}
Matrix::Matrix(){
    Matrix(10, 10);
}

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

我认为你的意图是做与Matrix::Matrix(int h, int w)相同的事情。但是你不能那样做。


如果您有C++11支持,您可以使用委托构造来做同样的事情。

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 = *(data + h);
row.set(w, value);

您正在将数组行复制到一个名为row的新数组中您没有复制构造函数。因此指针的值是直接复制的当函数返回row被破坏时这意味着row.data指向的内存也是deleted,这意味着矩阵中的数据也会受到影响,因为它指向相同的东西。请参阅三条规则

应该是

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

最新更新