获取堆上可用的内存大小

时间:2017-07-07 20:54:16

标签: c++ linux unit-testing memory-leaks heap-memory

这是Linux的平台相关问题。如果重要的话,我会特别询问有关前C ++ 11的内容。

我希望通过newdelete间接测试类的析构函数,以查看程序堆上的所有内存是否已释放,这可以检查内存泄漏。

object* x;        //pointer allocated on the stack
...               //measure available heap space
x = new object(); //allocated on the heap
delete x;         //deallocate that heap space
...               //measure again, see if it's the same

据我所知,Valgrind有Massif(......有一个Massif的C ++库吗?),我甚至可以对整个程序进行内存泄漏检查,但代码会发生变化。单元测试非常重要,而且让我死机我无法完全测试所有代码。

我可以编写哪些代码来衡量可用的堆空间?

1 个答案:

答案 0 :(得分:0)

堆栈和堆之间的区别在Linux中有点模糊。堆栈只是内存,其中最重要的是传递给创建新任务的clone()调用。对于新进程和新线程都是如此。分配器操作符是系统调用brk / sbrk的包装器。您最好的选择是覆盖全局operator new / operator new[]operator delete / operator delete[]来对呼叫进行某种计数,以便您可以在运行时间。

快速阅读new expression可以让您清楚地了解创建/销毁对象时发生的事情的顺序(如果您已经知道这一点,请原谅我)并且operator new会告诉订单查找分配器的位置。我可能错了,但是为了让所有分配器都经历从操作系统请求内存的同一点,即使是特定于类的operator new也必须最终调用全局operator new

那么,特定于类的那些可以使用mmap内存的分配器到文件或shmget来将对象映射到共享内存中的某个存储,但在这两种情况下它都不会&# 39;是传统上被称为"堆的一部分。"堆栈+堆都存在于你所看到的" VIRT"跑步时的记忆" top"在linux中。

除此之外,由malloc分配并传递给clone调用的内存(例如,创建一个新线程)作为新线程的堆栈将不会与用作堆的内存。