程序挂死std::bad_alloc,用gdb调试看不出是在哪里挂的

最近我其中的一个程序,每跑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知识,以熟悉什么场景下更适合使用哪种数据结构。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值