c++ - 类的析构函数中的访问冲突读取位置
问题描述
我已经构建了 Graph 类,一个构造函数和一个析构函数。我的问题是:当我编译这段代码时,我在这一行得到一个错误delete [] mat[i];
,错误是“访问冲突读取位置 0xDDDDDDCD。” 而且我不确定我做错了什么。我的意思是我只删除我动态分配的内存。稍后编辑:即使我使用它而不是我的方法:
Graph(int nr_noduri) {
this->nr_noduri = nr_noduri;
mat = new bool* [nr_noduri];
for (int i = 0; i < nr_noduri; i++) {
mat[i] = new bool[nr_noduri];
}
for (int i = 0; i < nr_noduri; i++) {
for (int j = 0; j < nr_noduri; j++) {
mat[i][j] = 0;
}
}
}
我的代码是:
#include <iostream>
#include <cstdlib>
using namespace std;
class Graph {
bool** mat;
int nr_noduri;
public:
Graph(int nr_noduri) {
this->nr_noduri = nr_noduri;
mat = (bool**)calloc(nr_noduri, sizeof(bool*));
for (int i = 0; i < nr_noduri; i++) {
mat[i] = (bool*)calloc(nr_noduri, sizeof(bool));
}
}
int size() {
return nr_noduri;
}
void addArc(int v, int w) {
if (v < nr_noduri && w < nr_noduri) {
mat[v][w] = true;
}
else cout << "Not enough nodes !" << endl;
}
bool isArc(int v, int w) {
return (mat[v][w] == true);
}
void print() {
for (int i = 0; i < nr_noduri; i++) {
cout << endl;
for (int j = 0; j < nr_noduri; j++) {
cout << mat[i][j] << " ";
}
}
cout << endl;
}
~Graph() {
//cout << nr_noduri;
for (int i = 0; i < nr_noduri; i++) {
delete [] mat[i];
}
delete[] mat;
}
friend void dfs(Graph g, int v, bool vazut[]);
};
void dfs(Graph g, int v, bool vazut[]) {
int w;
vazut[v] = true;
for (w = 0; w < g.size(); w++) {
if (g.isArc(v, w) && !vazut[w]) {
cout << v << "->" << w;
dfs(g, w, vazut);
}
}
}
int main() {
int nr_noduri;
cin >> nr_noduri;
Graph v(nr_noduri);
v.print();
v.addArc(1, 2);
v.addArc(2, 5);
cout << v.isArc(1, 2) << endl;
v.print();
bool vazut[100];
dfs(v, 1, vazut);
return 0;
}
解决方案
您不能用于释放由(或任何函数族)delete
分配的内存。改为使用来分配内存。calloc
malloc
new
Graph(int nr_noduri) {
this->nr_noduri = nr_noduri;
mat = new bool*[nr_noduri];
for (int i = 0; i < nr_noduri; i++) {
mat[i] = new bool[nr_noduri];
}
}
更好std::vector<std::vector<bool>>
的是,用于保存数据。
class Graph {
std::vector<std::vector<bool>> mat;
Graph(int nr_noduri) : mat(nr_noduri, std::vector<bool>(nr_noduri) {}
...
};
推荐阅读
- swift - Google-Cloud-Speech Adaptation Boost via Swift throwing error
- python - R^d 中点的 k-NN(定义联合空间)
- c++ - C++ 如何初始化 const share_ptr
在构造函数中? - javascript - 如何使用three.JS为几何中的每个三角形指定类
- continuous-integration - 如何在 Github 工作流中的多个作业中重用策略矩阵
- pointers - Nim lang GLM 和 OpenGL 矩阵指针统一问题
- python - 如何打印所需的路径名
- tensorflow-datasets - 使用 tensorflow-bq-io 使用 tf-dataset 训练 keras 返回具有相同数据的每个时间差
- css - 图片填满了 Safari 手机上的整个空间
- jquery - 如何在 jQuery 中选择数据标签选项元素?