C++中的堆损坏
Corruption of the heap in C++
我是C++的初学者程序员。最近,我开始使用C++进行图像处理。我正在尝试定义和使用以下函数:
Matrix MVE(Matrix R, double tolerance)
{
int n = R.Y();
Matrix P(n,4);
for (int i = 0; i < n; ++i)
{
P[i][0] = R[i][0];
P[i][1] = R[i][1];
P[i][2] = R[i][2];
P[i][3] = 1.0;
}
Matrix *Q = P.T();
double err = 1.0;
MatVectorCol u(n);
u.Set(1.0 / n);
MatVectorCol Mv(n);
while (err > tolerance)
{
Matrix uM(n, n);
uM.SetDiagonal(u);
Matrix *X = *Q * uM;
Matrix *X1 = *X * P;
Matrix invX(4, 4);
invX = *X1->Inverse();
delete X; // Error here!
delete X1;
}
return invX;
}
但是当我程序执行"删除X;"行时,我收到此错误:
Windows 在 plappd.exe 中触发了一个断点。
这可能是由于堆损坏,这表示 plappd 或它加载的任何 DLL 中存在错误.exe 中的错误。
这也可能是由于用户在 plappd.exe 具有焦点时按 F12。
矩阵类的构造函数和操作定义如下:
Matrix::Matrix(int _y, int _x)
{
x = _x;
y = _y;
M = new double [x * y];
buff = new double [x];
memset0_64(M, sizeof(double) * (x * y));
}
Matrix *Matrix::Transpose()
{
Matrix *b = new Matrix(x, y);
for (int i = 0; i < x; ++i)
{
double *b_line_i = (*b)[i];
for (int j = 0; j < y; ++j)
b_line_i[j] = (*this)[j][i];
}
return b;
}
Matrix *Matrix::operator * (const Matrix &m)
{
if (x == m.y)
{
Matrix *b = new Matrix(y, m.x);
for (int i = 0; i < y; ++i)
{
double *b_line_i = (*b)[i];
double *line_i = (*this)[i];
for (int j = 0; j < m.x; ++j)
for (int k = 0; k < x; ++k)
b_line_i[j] += line_i[k] * m(k, j);
}
return b;
}
else
return 0;
}
可以肯定的是,代码有问题,但我无法弄清楚它在哪里以及如何解决它。
提前谢谢。
你的代码的错误之处在于你过度使用/滥用运算符新的和动态的内存分配。除非必须,否则不要动态分配内存 - 这很容易出错,如果您是"初学者",您绝对应该避免这样做。(除非您使用另一种语言的动态分配内存并且知道自己在做什么(。
与其用new
分配双精度,不如使用std::vector<double>
或类似的容器。这样你就不必编写析构函数了。
如果你的类动态分配内存,它必须有析构函数。C++没有垃圾回收,所以没有人会为你清理烂摊子并释放资源。
如果你的类有析构函数,它应该遵守三规则。您应该定义复制构造函数和赋值运算符。否则将导致内存泄漏、未定义的行为和崩溃。
不要从运算符内部返回原始指针。不要从运算符返回动态分配的对象(如果必须返回动态分配的对象,请创建单独的函数(。如果必须返回动态分配的对象,请使用智能指针,因此它们的销毁将是自动的(std::shared_ptr
或boost::shared_ptr
应该有效(。
传统上,operator*
应按值返回对象。它应该看起来像这样:
Matrix Matrix::operator* (const Matrix &arg1, const Matrix &arg2){...}|
相关文章:
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- 使用全局声明的向量时,C++双重释放错误/损坏
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 损坏的结构字符数组 - sqlite C++
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- zlib 膨胀在使用小缓冲区时会损坏
- 正在调试 malloc():新内存损坏
- 变量周围的堆栈'sortArray'已损坏