有什么办法可以跟踪我的C ++程序中每个容器的大小吗?我有一个程序必须实时运行才能实际工作,并且内存随着时间的推移而增长可能是由于STL容器我忘记清理节点时完成它们。
它们没有适当的内存泄漏但是有很多容器我在其中写入数据,用它做一段时间的东西,擦除条目(我似乎并不是一直这样做)并继续前进。我想知道我是否可以追踪到我忘记清理哪些容器。我为我确定的重复问题道歉,但我无法为我的生活找到答案。
限制:
我很遗憾地限于那些,我无法改变这一点。有什么想法可以忽略向量等每个实例并在代码中打印?
答案 0 :(得分:3)
一种有趣的方法,可能是非常强大和高效的,但是一项非常重要的工作,就是编写自定义分配器。从最小分配器开始,如下所述:http://en.cppreference.com/w/cpp/concept/Allocator。然后,您可以添加两个关键内容:首先,在构造时,您可以获得回溯(例如https://panthema.net/2008/0901-stacktrace-demangled/,此处有许多在线资源),并将回溯与this
指针一起记录。然后,在每个allocate和deallocate调用上,您可以记录分配/释放的大小以及this指针。
最终,您的日志文件将包含指针映射的所有分配和释放大小,以及一个回溯,可以让您找出每个指针对应的代码中的对象。您可以添加其他日志记录语句,以了解相对于程序控制流程发生的位置。然后,您可以轻松编写一个python脚本,该脚本将运行分配/解除分配的总和,以查看容器在程序中各个点的大小。
一旦你编写了自定义分配器,你当然需要在任何地方使用它,这有点烦人但不太困难。最好将容器类型分解为中央头文件中的typedef,以便之后将其更改为标准分配器。
答案 1 :(得分:0)
谢谢大家的建议。你可能是正确的,唯一的方法是实际编辑分配器并添加我自己的代码。
最后,由于Valgrind太慢了,我尝试了gperftools,这也太慢但至少足够快,让我对我的代码中发生的事情有了一点线索。谢谢大家的建议。