信号 SIGABRT 即使我在 C++ 中使用 delete[]

signal SIGABRT even though i'm using delete[] in c++

本文关键字:delete SIGABRT 信号 C++      更新时间:2023-10-16
Mat::Mat(int R, int C)
{
    Ar = new int[C*R];
    Co = C;
    Ro = R;
}
Mat::~Mat()
{
    delete[] Ar;
}

然而,我在这个"删除"上得到了"信号SIGABRT"。

编辑:
我使用 XCODE,也尝试添加一个硬拷贝构造函数。我在删除[]中仍然收到此错误:

Mat::Mat(int R, int C)
{
    Ar = new int[C*R];
    Co = C;
    Ro = R;
}
Mat::Mat(const Mat& M): Co(M.Co), Ro(M.Ro)
{
    Ar = new int[M.Co*M.Ro];
    for (int i = 0; i<(M.Co*M.Ro); i++) {
        Ar[i] = M.Ar[i];
    }
}
Mat::~Mat()
{
    delete[] Ar;
}

这更多的是心理调试,但我非常确信,这是根本原因:
你应该遵循三法则
您应该为类 Mat 提供自己的复制构造函数复制赋值运算符,以便对指针进行深层复制。

如果您没有上述函数的自定义版本,则分配给指针成员的动态内存Ar每当创建和销毁类对象的临时副本时都会被释放,最终您留下一个悬空的指针成员,最后delete []调用它,导致未定义的行为和崩溃。

如果你的代码中有这样的内容:

{
Mat A(R1,C1);//create A.Ar
MAT B(A);//now B.Ar will point to A.Ar array
}//delete will be called twice for the same array