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

时间:2012-06-07 09:10:34

标签: c++ xcode

Mat::Mat(int R, int C)
{
    Ar = new int[C*R];
    Co = C;
    Ro = R;
}

Mat::~Mat()
{
    delete[] Ar;
}

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

修改
我使用XCODE,我也尝试添加硬拷贝构造函数。我仍然在delete []中收到此错误:

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;
}

2 个答案:

答案 0 :(得分:6)

这更像是通灵调试,但我深信,这是根本原因:
您应该按照 Rule of Three 您应该为类Mat提供自己的 复制构造函数 复制赋值运算符 指针。

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

答案 1 :(得分:1)

如果代码中的任何地方有类似的内容:

{
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