【C++】operator new/new operator/placement new之间的区别

new operator


new operator即是c++中的关键字new。比如A* = new A; 中的new就是new operator。
它执行了三个步骤:

1. 分配内存空间

事实上,分配内存这一操作就是由operator new(size_t)来完成的,如果类A重载了operator new,那么将调用A::operator new(size_t ),否则调用全局::operator new(size_t ),后者由C++默认提供。

2. 构造对象

以上面的例子来说,就是调用A::A()构造对象。

3. 返回地址

operator new


operator new有三种形式:

throwing (1)    
void* operator new (std::size_t size) throw (std::bad_alloc);
nothrow (2) 
void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) throw();
placement (3)   
void* operator new (std::size_t size, void* ptr) throw();

(1)(2)的区别仅是是否抛出异常,当分配失败时,前者会抛出bad_alloc异常,后者返回null,不会抛出异常。它们都分配一个固定大小的连续内存。

A* a = new A; //调用throwing(1)
A* a = new(std::nothrow) A; //调用nothrow(2)

(3)是placement new,它也是对operator new的一个重载,定义于#include <new>中,它多接收一个ptr参数,但它只是简单地返回ptr。其在new.h下的源代码如下:

#ifndef __PLACEMENT_NEW_INLINE
#define __PLACEMENT_NEW_INLINE
inline void *__cdecl operator new(size_t, void *_P)
        {return (_P); }
#if     _MSC_VER >= 1200
inline void __cdecl operator delete(void *, void *)
    {return; }
#endif
#endif

它可以实现在ptr所指地址上构建一个对象(通过调用其构造函数)
调用形式为:
new(p) A(); //也可用A(5)等有参构造函数

转自:http://blog.csdn.net/wudaijun/article/details/9273339

原文地址:https://www.cnblogs.com/cknightx/p/6758738.html