C++ new分配内存失败 内存碎块
作者:网络转载 发布时间:[ 2014/12/2 11:18:04 ] 推荐标签:C++ 内存 软件开发
不停的new和delete,有可能会导致分配一个较大的内存块时失败,主要是因为内存碎片。
如果new出稍大块的内存,失败一定会发生,原因在于内存碎片太多后,当在申请一块大内存时,系统无法分配一块连续的没有使用过的内存给你,解决方法 是申请一大块内存,在这一大块内存中再进行自己的分配,而不用系统的new,可以参考内存池的思想,其实nginx的内存分配思想更好,直接分配一大块内 存,进程所需内存在上面再划分,进程结束时再释放内存,对于长期运行的服务很有意义。
换用自己写的内存管理器能一定程度避免这种情况.
现代OS,new理论上不会失败,因为还可以把你的硬盘空间作为虚拟内存来分配.所以没必要检测new失败的情况,一旦真的分配失败,你接下来任何操作都可能失败,即使只显示个对话框或者写个log记录什么的都不一定能成功.直接让程序崩溃是好的办法.
你一次申请的内存太大了,所以失败。 在WINDOW系统中,现在不会出现内存不足的情况,因为有硬盘可以当内存分页使用,所以不会出现内存不足的情况,只有当你申请很大的一块内存,而系统还没有整理内存,查找不到这么大的连续内存块,所以失败。
boost::shared_array<uint8> data_ (new uint8[size]); 内存分配用boost的shared_array,利用boost栈对象保存分配的内存,在分配失败时 data_.get()为空,运行时可以很方便的找到错误点。
常规的char * tmp = new char[1024]若分配失败,但又没进行异常捕捉时,很难进行纠错。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11