博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
条款7:预先准备好内存不够的情况
阅读量:5322 次
发布时间:2019-06-14

本文共 1455 字,大约阅读时间需要 4 分钟。

1. operator new在无法完成内存分配请求时会抛出异常(在以前或者某些特定情况(声明nothrow)下new会返回0)

2. 使用C语言的宏定义处理会是这样

#define NEW(PTR, TYPE)							\	try {(PTR) = new TYPE; }					\	catch (std::bad_alloc&) { assert(0); }

3. 用C++的异常处理机制,处理方法是这样

#include 
#include
using namespace std;/*#define NEW(PTR, TYPE) \ try {(PTR) = new TYPE; } \ catch (std::bad_alloc&) { assert(0); }*///new异常处理模版类template
class NewHandlerSupport{public: static new_handler set_new_handler(new_handler handler); static void* operator new(size_t size);private: static new_handler current_handler;};//设置异常处理函数template
new_handler NewHandlerSupport
::set_new_handler(new_handler handler){ new_handler old_handler = current_handler; current_handler = handler; return old_handler;}//重写newtemplate
void* NewHandlerSupport
::operator new(size_t size){ void* memory = NULL; new_handler old_handler = ::set_new_handler(current_handler); try { memory = ::operator new(size); } catch (std::bad_alloc&) { set_new_handler(old_handler); throw; } set_new_handler(old_handler); return memory;}//初始化静态数据template
new_handler NewHandlerSupport
::current_handler;//具体类继承模版实例class Example : public NewHandlerSupport
{public: //...private: //...};int main(){ Example* e = new Example; return 0;}

4. 如果想让new分配失败不抛出异常而是返回0,可以像下面这样

int* i = new (nothrow) int;

转载于:https://www.cnblogs.com/WIT-Evan/archive/2012/06/11/7291493.html

你可能感兴趣的文章
CyclicBarrier的使用
查看>>
小程序开发笔记
查看>>
Web框架高级功能之模板、拦截器、Json、打包
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
安装scikit-learn过程记录
查看>>
数据库的标识符可以有多长
查看>>
新手村之循环!循环!循环!
查看>>
在创业公司上班的感受
查看>>
Shell脚本
查看>>
masm32V11配置
查看>>
ASP.NET中Request.ApplicationPath、Request.FilePath、Request.Path、.Request.MapPath
查看>>
通过Python、BeautifulSoup爬取Gitee热门开源项目
查看>>
正则表达式的用法
查看>>
线程安全问题
查看>>
集合的内置方法
查看>>
IOS Layer的使用
查看>>
Android SurfaceView实战 带你玩转flabby bird (上)
查看>>
Android中使用Handler造成内存泄露的分析和解决
查看>>
android代码控制seekbar的样式
查看>>
SSM集成activiti6.0错误集锦(一)
查看>>