关于c++内存申请new

在三年前我刚刚接触c++,当时只知道c++的new跟c的malloc唯一的差别就是new对调用c++的构造函数来初始化刚刚申请到的内存;当时我们都没有去探讨如果new失败会是什么样?

今天窥探了boost的对象池,里面的所有new都是这样写new(nothrow),后来查各种资料,在c++new文件中有这样的定义

void*operatornew(std::size_t)throw(std::bad_alloc);

void*operatornew[](std::size_t)throw(std::bad_alloc);

这个是在申请内存失败的时候会抛出一个std::bad_alloc的异常,如果我们没有去捕获这个异常,我们的程序将崩溃。

void*operatornew(std::size_t,conststd::nothrow_t&)throw();
void*operatornew[](std::size_t,conststd::nothrow_t&)throw();

这个是在申请不到内存输返回0,不会抛出异常,我们只需要判断new返回的存储是否正常就ok。

所以我们可以根据不用的函数写出不同的new

1,

char*p=NULL;

try

{

p=newchar[1024];

}

catch(...)

{

///对异常进行处理

p=NULL;

}

2,

char*p=new(std::nothrow)char[1024];

以上两种内存的申请都需要去判断p的最后值

if(p)

{

success!

}

else

{

fail!

}

你可能感兴趣的:(new,nothrow,c++内存)