【发布时间】:2015-09-05 20:25:44
【问题描述】:
此 C 代码(编译为 C++)没有释放内存。该程序在“新”行上以 992kB 开始,然后在分配内存后,它变为 10MB。释放内存后,它只下降到 3MB。即使执行 delete[] 也不会擦除内存。我做错了什么?
INT iSize=8192;
struct sUsernameA
{
TCHAR *sUsername;
};
sUsernameA *sArr = new sUsernameA[iSize]();
for (INT i=0;i<iSize;i++)
{
sArr[i].sUsername = (TCHAR*)calloc(512,sizeof(TCHAR));
}
for (INT i=0;i<iSize;i++)
{
free(sArr[i].sUsername);sArr[i].sUsername = NULL;
}
delete [] sArr;
【问题讨论】:
-
你是如何衡量消耗的内存的?
-
这是 StackOverflow 上的一个常见问题 - 大多数 malloc 实现都会为新分配维护一个内存池,因此在应用程序退出之前您不会看到所有内容都被释放。
-
这里的问题是,运行时基于一些任意方法决定是立即释放大分配,还是将其搁置,基于一些启发式 - 例如有多少和多大的分配程序已制定。如果您有一个应用程序进行大量小分配,那么运行时/操作系统将保留一些内存以防您再次这样做。如果您进行大量分配,它(可能)决定立即将其释放回操作系统。
-
这只是一种可能的情况。很难证明一个应用程序是否释放了它的内存,除非你使用侵入式方法(例如询问堆管理器它有多少内存,以及其中有多少实际上是空闲的)。
-
那可能是你的程序泄露了。