如何从动态数组中释放内存? C ++

时间:2014-01-19 13:10:22

标签: c++ memory

这是我的代码:

int** tmp = new int*[l];
for(int i = 0; i < l; i++)
    tmp[i] = new int[h];


for(int i=0;i< l;i++)
    delete[] tmp[i];
delete[] tmp;

我想知道我是否正确释放内存。我遇到的问题是,当我在任务管理器上检查我的程序进程时,内存不会丢失。

这是正常的吗?

2 个答案:

答案 0 :(得分:8)

上面的代码还可以,但总的来说,这是你希望在代码库中永远不会遇到的那种可怕的事情。

std::vectorboost::multi_array在这里都是更好的选择,并且它们会在没有所有不必要的容易出错的代码的情况下进行破坏。基本上如果你不得不想知道代码在做什么以及它是否正确,那么它已经出了问题。

CPU负载没有直接连接到内存分配,这只是代码中的另一个问题。一些循环无休止地轮询操作系统的某些东西可能是一个原因;除了分配和释放内存之外,我没有关于你的代码做什么的信息,因此很难说可以改进什么。


发表评论后......不要依赖任务管理器告诉你真正的程序的内存使用情况。使用专门的检漏仪。正如@ H2CO3指出的那样,操作系统可能不会立即将deleted内存报告为免费。

答案 1 :(得分:2)

在其准系统实现中,newdelete只是mallocfree(来自C库)的糖,因此我们将对此进行推理。< / p>

操作系统通常提供原语(de)分配内存,但是那些原语:

  • 不像mallocfree那样精细:它们按4K块工作,例如
  • 相对广泛:值得注意的是,它们通常会将内存清零

因此,mallocfree的大多数实现都不是围绕OS原语的简单单行包装,而是保留已分配页面池并在内部处理大多数请求。某些实现甚至具有每个线程池以避免争用(例如jemalloc)或具有每线程关联的多个池(例如tcmalloc)。

结果:

  • 更快malloc / free次来电
  • 以牺牲内存占用为代价略高于严格要求

注意:我还没有涉及碎片......