new/delete
在C++中动态分配与释放内存是通过new/delete和new []/delete []实现的。
- 当new分配内存失败时,默认情况将抛出bad_alloc异常,当然也可以通过传入nothrow_t类型的nothrow对象强制不抛出异常(new (nothrow) T/T []),此时分配内存失败就和malloc失败一样会返回nullptr。
- delete不抛出异常并且支持删除空指针,即delete nullptr是合法的。
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并不会动态分配内存,而是在传入的指针地址处“就地”进行对象的初始化工作。
网友评论