今天跑代码的时候碰到了这样的一个问题

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

解决不了,谷歌后发现如下文章,可以解惑,写的非常的好。
原文链接

当然,我这里只是针对我这一会儿的情况。最近跑的一个C++程序,迭代时间长,而且一共有800个迭代,等了一天,跑到第284个迭代就挂了,重新跑一次,同样的地方又挂了。各种检查是不是有申请了内存没释放(delete[])没释放的。最后,千辛万苦,终于发现,是vector这个小家伙捣的鬼。
在http://www.educity.cn/wenda/257316.html中说:
”事实超乎你的想象,我一个朋友用vector直接把内存吃光了,你好好检查下
如果有很多个的话,不妨手动清空掉,或者你不用vector试试,估计就不会出问题了
主要你知道吗,vector不止是出现内部内存碎片,它还导致外部内存碎片
vector开辟的是一个连续的空间,比方你这个空间是100M,分配不出来这么大的连续空间就报错了。
即使内存里还有1G但是没有连续100M的空间也会bad_alloc的“
下面摘自http://www.cnblogs.com/BeyondAnyTime/archive/2012/08/08/2627666.html,很好的一个vector总结
说v.~ vector () ,销毁所有数据,释放内存。
而后又看到另一个帖子:
http://www.cnblogs.com/lxshanye/archive/2013/05/20/3088558.html
说C++中的vector不能像C#一样有托管的垃圾回收机制回收被占用的内存空间,但是你可以在使用完vector后调用~vector()析构函数释放内存。
赶紧试一下这种方法,果然一举成功!
再次感谢网上的大神们!
后来又不行了,跑到第1200多个迭代的时候,又崩了。这回请教了下坐在我身后的阿龙大神,他说,我一次读入vector的数据只有20万行的话,其实只有一两兆,很小。建议我自己先开个数组,然后不要clear,下一回就直接覆盖上去就好了。我谢过后,正准备改,阿龙一个激灵,站起身来跟我说,其实也不用自己开,只要将”new vector“那句放出去就好了,意思是因为我是在函数内new vector,这就只能在stack中开空间,stack只有一两兆。应该放到函数外,即file scope上,这样就是在heap里开空间,这很大,不用担心。
身边有大神的感觉就像现在窗外的天,让人心情明媚极了!

看完后,遂把成员变量中的vector改成了map,正常运行。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐