【发布时间】: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< std::vector<signed int> > ifftResults;之类的东西,您几乎不必担心内存泄漏。 -
@Russbear:如果您希望内存真正释放回 Windows,那么您必须查看 Windows API。
VirtualAlloc我认为是你需要的功能。