【问题标题】:Not freeing memory in a C array不释放 C 数组中的内存
【发布时间】: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 实现都会为新分配维护一个内存池,因此在应用程序退出之前您不会看到所有内容都被释放。
  • 这里的问题是,运行时基于一些任意方法决定是立即释放大分配,还是将其搁置,基于一些启发式 - 例如有多少和多大的分配程序已制定。如果您有一个应用程序进行大量小分配,那么运行时/操作系统将保留一些内存以防您再次这样做。如果您进行大量分配,它(可能)决定立即将其释放回操作系统。
  • 这只是一种可能的情况。很难证明一个应用程序是否释放了它的内存,除非你使用侵入式方法(例如询问堆管理器它有多少内存,以及其中有多少实际上是空闲的)。
  • 那可能是你的程序泄露了。

标签: c++ struct free calloc


【解决方案1】:

内存管理有多种方法。 例如,您可以在wikipedia 中找到其中一些的解释。 dlmalloc我看惯了,但显然还有很多其他的技术。

在任何情况下,所有技术都需要支架,并且其中一些技术会尝试猜测程序员接下来关于内存管理的动作,因此确保您已将所有内存完全归还给操作系统的唯一方法是退出你的程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 2017-05-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多