如何检查我的 c++ 程序在内存中增长的状态
How to inspect what state of my c++ program is growing in memory?
我不使用动态内存分配(除了我做静态 A* a = new...但这只发生一次)...然而,当我运行几次迭代时,通过 top(1) 看到的内存使用量似乎随着迭代次数的增加而增加。我设置了一个具有高忽略计数的断点,然后检查内部数据结构以确保它们没有增长(我的大部分状态都在向量<向量>中),但它们被回收,并且所有条目都是大小/容量为 100(初始默认值)的向量,即使在一段时间后也是如此。向量>
有哪些方法可以使用 gdb 或其他任何东西来调查不断增长的内存跟踪?
如果你在Linux上,你可以使用很棒的Valgrind工具。安装它,使用-g
标志编译程序,然后运行
$ valgrind ./my_prog
并阅读它为您打印的日志,在那里您将看到内存使用情况的摘要以及如何获取更多信息的说明。
正如 Ivella 所建议的那样,您可以使用 Valgrind 来分析您的堆(通过 massif)或检查内存泄漏或访问错误(通过 memcheck)。您说您没有动态内存分配 - 但 std::vector 通过动态内存分配在堆上分配。不能保证C++标准库在程序运行期间始终将回收的堆内存返回到操作系统 - 因此内存利用率完全有可能随着时间的推移缓慢增加,同时不会以任何有害的方式泄漏。
对于内存错误/泄漏检查:
valgrind --tool=memcheck <program to analyse>
对于堆分析:
valgrind --tool=massif <program to analyse>
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 识别打开的共享内存状态的方法
- 复制有状态分配器:标准库分配器语义和内部内存
- 远程电脑的 CPU 使用率和内存状态
- 如何检查我的 c++ 程序在内存中增长的状态
- 释放LPDIRECT3D9和LPDIRECT3DDEVICE9后的内存状态
- 这是存储 std::分配器状态的正确方法 - 在这种情况下,由 Windows 上的共享内存支持
- 在动态内存分配中,在程序终止并且忘记释放内存后,该内存是否保持分配状态