如何处理大型 C++程序的内存泄露问题

2015-07-29 19:58:51 +08:00
 matthewgao

程序在一个月的运行中不断吃内存,一个月吃掉了32G的内存,但是线上系统还不能停,不能改配置。。。。 有什么好办法排除内存泄露的问题么?

2082 次点击
所在节点    C
31 条回复
eliteYang
2015-07-30 10:13:16 +08:00
强烈推荐intel vtunes分析,或者全局用智能指针,或者全局排查指针申请和释放的地方,看看有没有因为什么情况导致申请完后一些条件不满足,没有走到释放
hitmanx
2015-07-30 10:30:42 +08:00
生产环境不能停机的话,可以开发环境重新跑一次,并打开valgrind\address sanitizer之类的工具在运行时检测一下内存泄露。如果这也不行的话,可以上一些静态代码分析工具看看,比如coverity之类的
acgeo
2015-07-30 11:25:18 +08:00
楼上各位说得都是扯犊子的~~

这种情况,吃内存是无法避免的~

写个shell脚本 定时执行~ 这样每次执行完毕,进程结束会自动释放掉内存.
pp3182429
2015-07-30 13:29:40 +08:00
以前每次都是check所有分配内存的地方,是不是释放了…找所有的new和malloc==#。。
acgeo
2015-07-30 15:54:28 +08:00
楼上各位说得都是扯犊子的~~

这种情况,吃内存是无法避免的~

写个shell脚本 定时执行~ 这样每次执行完毕,进程结束会自动释放掉内存.
linux40
2015-07-30 16:27:50 +08:00
为什么不用标准库里的模板?虽然我不是很懂工程这种东西。。。
magicyu1986
2015-07-30 17:07:28 +08:00
上测试环境一块一块的排查,真没有其他好办法。

最好还是上一套半自动内存管理的东西:智能指针,循环引用检查啥的。
acgeo
2015-07-30 19:37:33 +08:00
楼上各位说得都是扯犊子的~~

这种情况,吃内存是无法避免的~

写个shell脚本 定时执行~ 这样每次执行完毕,进程结束会自动释放掉内存.!
matthewgao
2015-07-30 22:32:40 +08:00
程序比较老,写的时候没有一个好用的智能指针,然后是一个大牛自己写的智能指针,诡异的就在于各个版本从来没出过问题,就这一台机器,同版本的其他机器也没出过问题,这个机器也没什么特别特殊的配置,所以很诡异
我现在怀疑是STL,有些容器不会自动shrink的问题。
matthewgao
2015-07-30 22:33:10 +08:00
总之还是谢谢各位,我去试试AddressSanitizer,看看有什么效果不
matthewgao
2016-02-20 23:49:58 +08:00
我来做个了结,最终还是靠 review 代码, 找到了泄露的地方, 10w 行。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/209368

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX