运行时错误C++程序:检测到glibc,munmap_chunk(),指针无效
runtime error C++ program: glibc detected, munmap_chunk(), invalid pointer
我的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);
相关文章:
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 无法访问嵌套类.类的使用无效
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如何解决错误:SCIP C++中的 SCIP 阶段无效 <10>
- 在没有参数列表的情况下使用模板名称"Event"无效,模板问题
- FFMPEG配置文件级别id大小无效
- 错误:从"int"到枚举c++的转换无效
- 如何修复此错误:className::className的无效使用
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- C++-模板嵌套类的引用初始化无效
- 错误:无效的预处理指令 #i 的意思是 #if?
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 从 'int' 到 'int*' CPP 的转换无效
- 如何接受 [ENTER] 键作为无效输入并发送错误消息
- 由于无效的 ValidateRgn() 子窗口不会收到WM_PAINT消息
- C++ PTHREADS - 无效转换无效*(*)()到无效*(*)(无效*)
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 数组下标的类型"float*[float]"无效
- 修改 std::vector 会使迭代器无效吗?