new失败抛出异常吗?

2019-08-06  本文已影响0人  RC_HT

new/delete

在C++中动态分配与释放内存是通过new/delete和new []/delete []实现的。

operator new/operator delete

当直接调用new/delete时,其实内部执行了好几个步骤,对于new而言,首先是调用某个重载的operator new分配出内存,然后再在该内存构造出对象,最后返回。下面是C++自带的operator new和operator delete函数:

//默认情况下调用的operator new和operator delete
void *operator new(size_t); // allocate an object
void *operator new[](size_t); // allocate an array
void *operator delete(void*) noexcept; // free an object
void *operator delete[](void*) noexcept; // free an array

//传入nothrow参数时调用的operator new和operator delete
void *operator new(size_t, nothrow_t&) noexcept;
void *operator new[](size_t, nothrow_t&) noexcept;
void *operator delete(void*, nothrow_t&) noexcept;
void *operator delete[](void*, nothrow_t&) noexcept;

//该函数用于placement new,由系统保留不能被重载
void *operator new(size_t, void*); // this version may not be redefined

所以new (nothrow) T/T[]的原理就是因为调用了重载函数oprerator new不会抛出异常的版本

placement new

placement new并不会动态分配内存,而是在传入的指针地址处“就地”进行对象的初始化工作。

上一篇 下一篇

猜你喜欢

热点阅读