这是 Linux 的平台相关问题。如果这很重要,我会专门询问 C++11 之前的情况。
我想通过 new
和 delete
间接测试一个类的析构函数,看看程序堆上的所有内存是否都被释放,这可以检查内存泄漏。
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++ 库...?),我什至可以对我的整个程序运行内存泄漏检查,但代码会更改。单元测试很重要,我不能对我的所有代码进行完全单元测试,这让我很烦。
我可以编写什么代码来测量可用堆空间?
最佳答案
堆栈和堆之间的区别在 Linux 中有些模糊。堆栈只是内存,其顶部被传递给创建新任务的 clone()
调用。对于新进程和新线程都是如此。分配器运算符是系统调用 brk
/sbrk
的包装器。最好的办法是覆盖全局 operator new
/operator new[]
和 operator delete
/operator delete[]
以您可以在运行时检查的方式对调用进行某种计数。
快速阅读 new expression可以让您很好地了解创建/销毁对象时发生的事情的顺序(如果您已经知道,请原谅我)和operator new将告诉查找分配器的顺序。我对此可能是错误的,但为了让所有分配器都通过同一点从操作系统请求内存,即使是类特定的 operator new
最终也必须调用全局 operator新的
。
好吧,特定于类的那些可以使用分配器将内存mmap
到文件或使用shmget
将对象映射到共享内存中的某个存储,但在这两种情况下在这些情况下,它不会成为传统上称为“堆”的部分。当您在 Linux 中运行“top”时,栈+堆都位于您所看到的“VIRT”内存中。
除此之外,由 malloc
分配并传递给 clone
调用(例如,创建一个新线程)的内存将成为新的堆栈thread 不会与用作堆的内存不同。
关于c++ - 获取堆上可用内存的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44979460/