【 在 confusing 的大作中提到: 】
: 这个问题困扰了我好多天了。
: 因为程序有些复杂,是嵌套了三层结构的map<int, map<int, vector<int>> a; 这种。
: 开始犯的错误是参数传递的时候没有形参,导致每次都复制一份,内存使用飙升。然后以为没有释放干净,用Valgrind查不出问题。
: ...................
其实你就差最后一步了,从发现内存耗尽这个问题,到主贴的几行代码,已经成功定位故障。
那几行代码的问题原因推测是: linux的glibc可能为减少频繁内存申请,进行了内存访问优化,导致在内存不足的设备上使用std::map,可能需要特殊处理("malloc_trim")
在linux下,malloc()/free()的实现是由glibc库负责的。STL的内存释放,有时候并没有直接返还给os,只是返还给了分配器。
回帖的验证代码在windows上运行,不需要“malloc_trim”就可以直接"释放内存"了
最后问题解决的方法我自己觉得不是best practice,这种在linux上需要频繁申请/释放内存的场景是不是用TCMalloc (google-perftools) 会更好些(我没验证)
--
FROM 58.212.12.*