繁体   English   中英

即使我在C ++中使用delete []也会发出信号SIGABRT

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

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

这更多是出于心理调试,但我深信,这是根本原因:
您应该遵循三法则
您应该为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM