内存块太小导致malloc和new返回空指针,该怎么处理?
- 对于
malloc
来说,需要判断其是否返回空指针,如果是则马上用return
语句终止该函数或者exit
终止该程序; -
对于
new
来说,默认抛出异常,所以可以使用try...catch...
代码块的方式:try { int *ptr = new int[10000000]; } catch(bad_alloc &memExp) { cerr << memExp.what() << endl; }
还可以使用
set_new_handler
函数的方式:void no_more_memory() { cerr << "Unable to satisfy request for memory" << endl; abort(); } int main() { set_new_handler(no_more_memory); int *ptr = new int[10000000]; }
在这种方式里,如果
new
不能满足内存分配请求,no_more_memory
会被反复调用,所以new_handler
函数必须完成以下事情:- 让更多内存可被使用:可以在程序一开始执行就分配一大块内存,之后当
new_handler
第一次被调用,就将这些内存释放还给程序使用; - 使用另一个
new_handler
; - 卸除
new_handler
:返回空指针,这样new
就会抛出异常; - 直接抛出
bad_alloc
异常; - 调用
abort
或exit
。
- 让更多内存可被使用:可以在程序一开始执行就分配一大块内存,之后当
评论(2)
这个问题本身就有问题。“内存块太小”通常不会导致malloc返回空指针。在我机器上,malloc(0)都不会返回空指针。
可以用new(std::nothrow)版本来返回空指针而不是抛出异常