【问题标题】:runtime error C++ program: glibc detected, munmap_chunk(), invalid pointer [closed]运行时错误 C++ 程序:检测到 glibc,munmap_chunk(),无效指针 [关闭]
【发布时间】:2013-05-05 20:18:28
【问题描述】:

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

*** 检测到 glibc *** ./matrix: 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;
}

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);
}

...

ma​​in.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 我确实使用了调试器,并将其缩小到方法 Matrix::set,但我包含了所有代码以防万一 - 但你当然是对的 - 我会清理到重要的部分
  • 问题是你使用指针和动态分配。用指针和动态分配编写正确的代码基本上是不可能的。请改用std::vector&lt;int&gt;
  • @KerrekSB 不幸的是,这是课堂作业,我必须使用“原生”数组...

标签: c++ glibc


【解决方案1】:
Matrix::Matrix(){
    Matrix(10, 10);
}

这不是你想的那样。它只是创建一个 临时矩阵 并丢弃它。这意味着正在构造的 Matrix 的高度、宽度和数据并未在此处初始化

我认为您的意图是做与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 = *(data + h);
row.set(w, value);

您正在将数组行复制到一个名为row 的新数组中。 您没有复制构造函数。所以直接复制指针的值。 函数返回时row被破坏表示row.data指向的内存也是deleted,表示矩阵中的数据也受到影响因为它指向同样的事情。见The rule of three

应该是

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

【讨论】:

  • 好的,谢谢!我解决了这个问题,但这不是问题,因为我总是在创建矩阵时指出矩阵的大小......
  • @StringerBell 查看编辑。而且你也有与Array::Array()中的第一个类似的问题;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2016-08-08
  • 2014-05-14
  • 1970-01-01
  • 2016-03-16
  • 2013-08-01
相关资源
最近更新 更多