【发布时间】:2015-07-08 21:43:06
【问题描述】:
在编写一些代码来计算简单 3 x 3 矩阵的行列式时,我注意到它开始累积内存泄漏。我已将方法简化为以下(这意味着我不再使用算法来确定任何矩阵的大小,而是“手动”完成):
double Determinant(double** &m)
{
return m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) -
m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) +
m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);
}
我找不到这个问题,因为我没有在方法内分配任何内存。如果我更改它并简单地返回一个双精度(例如return 1.0),泄漏就消失了。这里发生了什么?
编辑(更多代码):
double LogMultivariateNormalDensity(unsigned char* &x, unsigned char* &mean, double** &sigma)
{
double det = Determinant(sigma);
...
}
在循环中依次调用
for(unsigned int i = 0; i < n; i++)
{
LogMultivariateNormalDensity(_x[i], _mean[i], _sigma[i])
}
作为二维数组,_sigma 使用 malloc 分配(在两个维度上)。
【问题讨论】:
-
unsigned int n是干什么用的? -
您发布的代码中没有内存泄漏。然而,在调用这个函数的代码中可能有一个——如果编译器能够在这个函数被一个虚拟实现替换时内联这个函数,那么导致泄漏的代码可能只是被优化掉了。或者可能存在泄漏的代码,它仅根据行列式值有条件地调用,而不是用虚拟值调用。无论哪种方式,我们都需要更多的上下文来提供帮助。
-
您的函数中没有内存泄漏。请发布更多代码 - 问题可能与调用此函数的代码有关。
-
m使用后是否被删除?m属性的每个子数组在使用后都会被删除吗? -
同样的问题:用 malloc 分配的内存在哪里释放? (我首先假设你使用了 new/delete)
标签: c++ matrix memory-leaks