继续之前的项目。跑录像的时候,本地测试为2G内存的机器,效果还行。没有出现挂掉的现象。
但把代码重新编译在外面跑的时候就出现了段错误,double free list_node_base nohook .一类的gdb信息。
后询问大牛,得知应该是list的迭代器失效引起。
经检查,的确如此。。
有一段类似于以下代码
for(i = list.begin(); i !=list.end();i++)
{
if ( (*) == p)
{
}
}
之前有加锁。后来使用了新的加锁方法,、把链表的每一次操作加锁,而不是全部加锁,
也就是list.end(),并不是调用STL的end() 而是先lock 再调再unlock 自己进行了一次类的封装操作。
由于这个影响,导致多线程在判断的时候。有可能会有二个传入的值同时被判断,其中一个over这后顺利进行。另外一个再进行操作。就段错误。
奇怪的是同样二个机器同时测试。就一个出来了错误。。。想来是小错误。很少会碰到。double free 的情况和原生代码杂乱也有一定关系
把之前的项目中的new 与delete进行了替换,使用缓存池来维护获取到的内存块指针。
发现如下问题。
一、原代码中使用多线程结构,有部分指针被多次delete.
二、服务端,客户端数据压力大,使用200路时,内存消耗达到700M/240M ,数据使用大起大落,走到后面死掉
100路时跑一晚上暂无问题
内存池本身问题: 加锁设计不够,向系统申请时并未加锁,导致多个线程同时申请多块内存。
今天拿到一个project 在看。其中的问题就在于多次申请与释放内存,导致到后期malloc会失败。
最方便的解决办法就是做一个内存管理层,接管系统的内存调用函数,使用内存管理的方式,一次申请,一次释放。
有两种做法,一个是用一个list来维护全部的数据
另外一个是用两个list来维护,其中一个是被应用程序使用的内存区,其中一个是已经申请,尚未使用或者被应用程序释放的区块。
freelist usedlist
list 大小固定(对于目前的应用场合)