分享
 
 
 

vc7.1中stl::deque的大bug

王朝vc·作者佚名  2006-01-27
窄屏简体版  字體: |||超大  

测试程序员一直报告说我写的程序有内存泄漏,在前几天怀疑了ADO以后,内存泄漏问题仍然没有发现原因。因为相信自己的能力,首先是源代码排查,看自己写的源代码,怎么都没发现有内存泄漏的迹象啊。为什么会内存泄漏呢?奇怪!

只好先分析一下测试程序员怎么测的:他是在给我做压力测试,首先,是内存狂涨,这是预料之中的:来不及处理的数据会在内存中排队。测试程序跑完了,按照常规,排队数据会逐渐处理掉,内存应该下降才对,因为是多线程协作的程序,仔细查看了自己写的带锁的队列,看不出问题。开始郁闷了,怀疑是不是其他的某个部分有内存泄漏?但是回想自己的代码,几乎从未使用过原始指针,不应该啊,而且,那么大数量的内存泄漏,肯定是在某个压力很大的地方产生的,而各个环节之间,就是通过我的LockedQueue来传递数据的,甚至怀疑是不是push_back的时候分配内存失败导致的了。

终于,自信心崩溃,怀疑自己的代码确实有bug,只是自己没有看出来,于是,在控制台部分增加对队列大小的监视。当系统其他部分都工作完毕,唯有将某个队列写文件的线程还在忙碌时,发现,尽管队列大小在迅速下降,内存则分毫未动。问题差不多肯定出在我的pop上了。查看pop代码,还是没看出任何问题。突然灵光一闪:我的队列基于std::deque实现的,难道ms的stl::deque的实现有问题?因为,vector pop数据并不减少内存的概念已经深入骨髓了,而deque释放元素后,会释放内存一直是用来和vector作对比的,一直以为,ms的deque在弹出元素时,如果能空闲出一个块时,就一定会把这个块释放掉的(deque是以块的方式分配内存的)。既然怀疑了,先写一个测试程序:

int count = 1500 * 10000;

deque<RawUserInfo> t;

RawUserInfo info;

for ( int i = 0; i < count; i++) {

t.push_back(info);

}

while(!t.empty()) {

t.pop_front();

}

cout << "please check mem";

果然,耗掉了我1.5G内存,没有释放!

去看一看源代码吧:

if (!empty())

{ // something to erase, do it

size_type _Block = _Myoff / _DEQUESIZ;

this->_Alval.destroy(_Map[_Block] + _Myoff % _DEQUESIZ);

if (_Mapsize * _DEQUESIZ <= ++_Myoff)

_Myoff = 0;

if (--_Mysize == 0)

_Myoff = 0;

}

只有destory,没有deallocate!郁闷吶,害我这么久,还一直怀疑测试人员的数据。不过也有高兴的一面:俺的代码还是经得起考验的~~。

再接再厉,顺便看看vc8.0的stl,除了增加了一点debug时的支持,问题照旧。再看看俺喜欢的stlport,手头上的是4.6.2版本,有内存释放的代码:

void pop_front() {

if (this->_M_start._M_cur != this->_M_start._M_last - 1) {

_STLP_STD::_Destroy(this->_M_start._M_cur);

++this->_M_start._M_cur;

}

else

_M_pop_front_aux();

}

template <class _Tp, class _Alloc >

void

__deque__<_Tp,_Alloc>::_M_pop_front_aux()

{

_STLP_STD::_Destroy(this->_M_start._M_cur);

this->_M_map_size.deallocate(this->_M_start._M_first, this->buffer_size());

this->_M_start._M_set_node(this->_M_start._M_node + 1);

this->_M_start._M_cur = this->_M_start._M_first;

}

而且,我还发现了一个问题,按照stl其他部分惯例,stl一般是不关心调用条件是否满足的,程序原一定要自己保证的,例如,我们绝不应该在在一个空的容器上:*cont.begin();

因此,我们也不应该在空deque上pop_front();然而,ms的stl却多了个if(!empty()).在一次,可爱的stlport和我预期的一直,并没有检查pop的合法性问题。

这种细节的障碍,真是害死人啊!

再来反省ms的实现:它愿意增加一个empty的检查,却不实现deque的内存缩减,似乎让我看到了一些微软的思维逻辑。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有