【问题标题】:2D Array Memory Leak - Should be easy, I feel stupid2D Array Memory Leak - 应该很容易,我觉得很愚蠢
【发布时间】:2011-08-24 21:22:23
【问题描述】:

非常简单的代码:

signed int **ifftResults = (signed int **)malloc(sizeof(signed int *) * recordsPerBuffer);

for (int i=0; i < recordsPerBuffer; i++)
{
    ifftResults[i] = (signed int*)malloc(sizeof(signed int) * fftLength);
}

然后:

for (int i=0; i < recordsPerBuffer; i++)
{
   free(ifftResults[i]);
}
free(ifftResults);

当我注释掉这些行时 - 没有内存泄漏。当它们存在时 - 内存泄漏。希望我只需要另一双眼睛,因为我一辈子都看不到哪里出了问题。

【问题讨论】:

  • 不,那里没有内存泄漏。你的问题一定出在其他地方。第一个问题,如果你注释掉上面的行,你怎么知道有内存泄漏。你是怎么测量的?
  • @Russbear:任务管理器实际上是衡量代码使用的实际资源量的一种非常糟糕的方法。操作系统可能会在后台执行许多操作,例如缓存和其他一些内存簿记操作,这些操作会导致数字出现偏差。
  • @Russbear:这是一个非常普遍的误解。任务管理器不是衡量内存泄漏的有效方法。当您释放内存时,它会再次对您的应用程序可用,但它不会再次对任何人可用。所以任务管理器仍将其显示为分配给您的应用程序。
  • 由于您使用的是 MFC,因此您必须使用 C++ 编译器。在 C++ 中,我们有一个叫做 std::vector 的东西,它比 malloc()-ing 2D 数组要好得多。相当于std::vector&lt; std::vector&lt;signed int&gt; &gt; ifftResults; 之类的东西,您几乎不必担心内存泄漏。
  • @Russbear:如果您希望内存真正释放回 Windows,那么您必须查看 Windows API。 VirtualAlloc我认为是你需要的功能。

标签: c++ c memory 2d


【解决方案1】:

我在写这篇文章时提供的代码似乎不足以回答“为什么”的问题。

但是,由于您使用的是 C++,因此您可以使用 std::vector 确保没有内存泄漏。

像这样:

// Allocation.
std::vector< std::vector< int > >  fftResults( recordsPerBuffer, std::vector< int >( fftLength ) );

// Usage:
fftResults[y][x] = blah;

// Deallocation: automatic.

实现矩阵的另一种方法是

std::vector< int >  fftResults( recordsPerBuffer*fftLength );

然后计算给定 (x,y) 的索引。

干杯,

【讨论】:

  • 应该是std::vector&lt; int &gt;( fftLength )recordsPerBuffer*fftLength
猜你喜欢
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 2021-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
相关资源
最近更新 更多