Exc_bad_access with pointers

Exc_bad_access with pointers

本文关键字:pointers with bad Exc access      更新时间:2023-10-16

我一直在使用矩阵和图形的项目工作。问题是当我编译它时,下一行弹出:

EXC_BAD_ACCESS (code=2, address=0x7ffff5f3ffff8)

在下一个方法中出现;它是我的类的构造函数:

GrafoMatriz::GrafoMatriz(){
    maxVerts = 1;
    GrafoMatriz(maxVerts);
}
typedef int * pint;
class GrafoMatriz {
    ...
    int maxVerts;
    int numVerts; 
    Vertice * verts; // there's another class Vertice
    int ** matAd; 
    GrafoMatriz();
    GrafoMatriz(int mx); 
    ...
}
GrafoMatriz::GrafoMatriz (int mx){
    maxVerts = mx;
    verts = new Vertice[mx]; 
    matAd = new pint[mx]; 
    numVerts = 0;
    for (int i = 0; i < mx; i++)
        matAd[i] = new int[mx];
}

我一直在阅读可能出现的问题,可能是指针的问题:

指针可能从未初始化过。

指针可能因超出数组边界而被意外重写。

指针可能是类型转换错误的对象的一部分,然后写入。

上述任何一种操作都可能损坏指向该指针或其附近的另一个指针,并且使用该指针会损坏该指针(依此类推)。

我猜这是关于我的指针pint的事情,但我是c++的新手。所以,我还没能修好它。顺便说一下,我在英特尔Macbook Pro上使用Xcode 6.4。

正如@kuroineko在注释中提到的,在c++中不能从另一个构造函数调用一个构造函数。如果使用c++ 11(或更高的标准),则可以使用委托构造函数。否则,您可能需要定义一个初始化函数,例如:

void GrafoMatriz::Initialize(int mx){
    maxVerts = mx;
    verts = new Vertice[mx];
    matAd = new pint[mx];
    numVerts = 0;
    for (int i = 0; i < mx; i++)
        matAd[i] = new int[mx];
}
然后你可以从不同的构造函数中调用这个初始化函数:
GrafoMatriz::GrafoMatriz(){
    Initialize(1);
}
GrafoMatriz::GrafoMatriz (int mx){
    Initialize(mx);
}

据我所知,剩下的代码应该可以编译。我不知道与变量matAd相关的代码是否正确,但至少它不会为我崩溃。