C++ new的三种形式的区别

C++语言中new运算符共有三种形式:

1 void* operator new (std::size_t size) throw (std::bad_alloc);
2 void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw();
3 void* operator new (std::size_t size, void* ptr) throw();
new主要完成的工作包含2步:
  1. 向系统堆申请size大小的内存。
  2. 调用要new的对象的构造函数,完成对象的初始化工作。

上面三种形式的new的主要区别在于:

第一种形式void* operator new (std::size_t size) throw (std::bad_alloc)会在向系统堆申请内存失败的时候抛出std::bad_alloc的异常

第二种形式void* operator new (std::size_t, const std::nothrow_t nothrow_constant) throw()和第一种形式不同的是会在向系统堆申请内存失败的时候返回null而不是抛出异常。

上面的两种形式都是C++中最常见的内存分配方法,对于第三种分配方法相对少见一点,第三种形式void operator new (std::size_t size, void ptr) throw()则是需要用户传递一个分配好的内存指针,然后会调用对象的构造函数完成对象的构造。 和第一、第二种方法不同在以下几点:

  1. 这种形式需要添加#include
  2. 方法不能重载这种形式的new。
  3. 这种形式的new应用在通过内存池分配内存的情况下,用户可以通过内存池获取需要对象大小的内存,值得注意的是当需要立即调用对象的构造函数对对象进行初始化的时候这种形式的new就派上用场了。

下面是以上三种形式的new调用的代码.

//第一种形式:
int* p = new int;  

//第二种形式:
int* p = new (nothrow) int;

/*第三种形式
代码来自tinyxml的源代码,https://github.com/leethomason/tinyxml2/blob/master/tinyxml2.cpp
commentPool是一个内存池。 XML_Comment 为需要构造的对象,this为XML_Comment构造函数的参数
*/
XMLComment* comment = new (commentPool.Alloc()) XMLComment( this );

原文链接: https://www.cnblogs.com/zhigaochen/archive/2012/05/19/2509293.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/50599

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午2:14
下一篇 2023年2月9日 上午2:15

相关推荐