【问题标题】:Memory leak when calculating a determinant of a matrix计算矩阵行列式时的内存泄漏
【发布时间】: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


【解决方案1】:

malloc 分配的内存必须用free 释放。总是,即使是少量的内存。

【讨论】:

  • 这个我知道,但是为什么我只是访问它时它会扩展?
  • 可能是由于编译器优化。您可以关闭所有优化以查看差异。
猜你喜欢
  • 1970-01-01
  • 2015-07-22
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2013-08-23
相关资源
最近更新 更多