c++ - 获取堆上可用内存的大小

标签 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++ 库...?),我什至可以对我的整个程序运行内存泄漏检查,但代码会更改。单元测试很重要,我不能对我的所有代码进行完全单元测试,这让我很烦

我可以编写什么代码来测量可用堆空间?

最佳答案

堆栈和堆之间的区别在 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/

相关文章:

c++ - vector 中存储的表达式的惰性求值

c++ - 分配 vector 值

linux - 关于 Linux 内存类型的问题

linux - 在 npm install -g 之后尝试运行时没有这样的文件或目录

unit-testing - 访问器的单元测试是必须的吗?

python - 用于测试和开发的模拟 python http 请求

c++ - 虚拟方法和模板方法 C++

c++ - 等效于 std::map 的 remove_if

c# - 如何为假货创建有意义的单元测试

linux - Bash 中的 MySQL 备份脚本