c++ - 类的析构函数中的访问冲突读取位置

标签 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) {}

   ...
};

关于c++ - 类的析构函数中的访问冲突读取位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58629872/

相关文章:

c++ - std::optional<T> 和采用对 T 的非常量引用的函数

c++ - 合并排序问题 - C++ 中的实现

c++ - 如何在多个类中传递一个静态对象?

c++:实现相等方法——如何确保给定对象与此引用不同?

c++ - C++ 标准对于从类型 a 转换为类型 b 与实例化/构造类型 b 之间的区别有何规​​定?

c++ - NULL 指针调用立即失败

c++ - 在 C 或 C++ 中不使用 header 进行编码有哪些客观原因?

c++ - 从 C++ 调用 dll 函数

python - 使用 Cython 包装具有 OpenCV 参数的 C++ 函数

关于模板类型的 C++ 设计问题