您的位置:首页 > 其它

内存分配失败处理

2013-10-16 23:38 1126 查看
一、C语言中的malloc/calloc/realloc/valloc/alloca/memalign函数:

这样的内存分配函数在内存分配失败时都返回空指针,因此,在调用返回时,检查返回值的方法比较简单,只需要与空指针比较即可;

如:

char* p = (char*)malloc(1204);

if(p == NULL)

{

 //error handle;

};
char* pp = (char*)calloc(3,1024);

if(pp == NULL)

{

 //error handle;

};
二、C++中的new操作符:

C++中的new操作符在分配内存失败时默认的操作是抛出一个内置的异常,而并不是直接返回空指针;这样的话,再把返回值与空指针比较,就没有什么意义了;因为,C++抛出异常之后,就直接跳出new操作符所在的那一行代码,而不再执行后续的代码行了,所以,对new操作符返回值的判断代码就执行不到了;当然,标准C++也提供了抑制抛出异常的方法,使之不再排除内存分配失败的异常,转而直接返回空指针,这是因为比较古老的编译器里面可能没有异常处理机制,不能捕获到异常;如:

int* p = new int[SIZE];

if(p == 0) //检查p是否是空指针;这个判断没有意义;

{

 return -1;

}
所以,在C++中有两种方法来处理new操作符分配内存失败的错误;

1、通过捕获new操作符抛出的异常:

 char* p = NULL;

 try

 {

  p = new char[1024];

 }

 catch(const std::bad_alloc& ex)

 {

  //exception handle;

  return -1;

 }
2、抑制异常的抛出:

 char* p = NULL;

 p = new(std::nothrow)char[1024]; //这样的话,如果new分配内存失败,就不会再抛出异常,而是返回空指针了;

 if(p == NULL)                    //这样的判断就有意义了;

 {

  //error handle;

  return -1;

 }

本文转自http://blog.csdn.net/app_12062011/article/details/7302673
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息