这是我的代码:
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;
我想知道我是否正确释放内存。我遇到的问题是,当我在任务管理器上检查我的程序进程时,内存不会丢失。
这是正常的吗?
答案 0 :(得分:8)
上面的代码还可以,但总的来说,这是你希望在代码库中永远不会遇到的那种可怕的事情。
std::vector
或boost::multi_array
在这里都是更好的选择,并且它们会在没有所有不必要的容易出错的代码的情况下进行破坏。基本上如果你不得不想知道代码在做什么以及它是否正确,那么它已经出了问题。
CPU负载没有直接连接到内存分配,这只是代码中的另一个问题。一些循环无休止地轮询操作系统的某些东西可能是一个原因;除了分配和释放内存之外,我没有关于你的代码做什么的信息,因此很难说可以改进什么。
发表评论后......不要依赖任务管理器告诉你真正的程序的内存使用情况。使用专门的检漏仪。正如@ H2CO3指出的那样,操作系统可能不会立即将deleted
内存报告为免费。
答案 1 :(得分:2)
在其准系统实现中,new
和delete
只是malloc
和free
(来自C库)的糖,因此我们将对此进行推理。< / p>
操作系统通常提供原语(de)分配内存,但是那些原语:
malloc
和free
那样精细:它们按4K块工作,例如因此,malloc
和free
的大多数实现都不是围绕OS原语的简单单行包装,而是保留已分配页面池并在内部处理大多数请求。某些实现甚至具有每个线程池以避免争用(例如jemalloc
)或具有每线程关联的多个池(例如tcmalloc
)。
结果:
malloc
/ free
次来电注意:我还没有涉及碎片......