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

2 回答 2

6

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

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

于 2012-06-07T09:11:52.490 回答
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
于 2012-06-07T09:21:34.860 回答