最近我其中的一个程序,每跑10~20min,它就会自动挂死抛出来的异常是std::bad_alloc。相信大家对std::bad_alloc肯定很熟悉了,这里就不做介绍了,然后我用gdb调试看看是哪里抛出来的异常。结果堆栈没有显示如何有关函数调用的任何有用信息:如图下:
因此只能根据抛bad_alloc错误一般都是内存异常。所以我就重点去查看程序中对内存处理的代码。然后我对代码中std::vector的赋值作了改动之后程序就不会出现挂死现象了,代码改动就如下:
//这里是为了给大家说明a和b的类型
std::vector<class> a;
std::vector<class> b;
a = b;//原来的写法
a.swap(b);//新改的。
为什么这样子改之后程序就正常了呢?
其实如果大家真正的了解过vector,就大概知道原因了。vector在底层实现中,其是连续存储的内存。假如你的可用内存是1G,由于又内存碎片的产生,可能会导致没有连续10M的内存。然而,程序这时需要生成一个10M大小的vector变量。很明显,系统无法为程序开辟出这么大的一块连续空间。所以只能抛出异常。
因此,
1、使用vector时,当vector变量不再使用了,要主动调用vector<>::swap()接口清空数组,减少内存碎片的产生和内存占用。
2、多学习了解STL知识,以熟悉什么场景下更适合使用哪种数据结构。