信号 SIGABRT 即使我在 C++ 中使用 delete[]
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,也尝试添加一个硬拷贝构造函数。我在删除[]中仍然收到此错误:
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
相关文章:
- 运算符C++ "delete []"仅删除 2 个前值
- g++用户定义的动态链接库上的全局new和delete运算符
- 为什么"delete"关键字不删除节点?
- "delete"在 C++ 中实际上做了什么?
- 析构函数和'delete'之间的区别
- 中止信号来自 C++ 中的中止(3) (SIGABRT)
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 析构函数中的"delete this"
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 即使在使用 delete[] 后仍保留的元素
- 如果我在下面的代码片段中添加"delete[] d;",为什么我得到零?
- 为什么我在此代码中收到 SIGABRT 错误
- C++原始指针和"delete"
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 重载 new 和 delete 会导致 valgrind 错误
- 为什么"delete"操作员给我访问权限冲突
- OpenCL 内核计时测量 0 秒或导致 SIGABRT
- 信号 SIGABRT 即使我在 C++ 中使用 delete[]