应用`operator new(std :: size_t);`和`new-expression`有什么区别?

时间:2014-07-12 12:42:23

标签: c++

我想了解operator new(std::size_t)new-expression之间的所有差异。

#include <iostream>
#include <new>

using std::cout;

struct A
{
    int a;
    char b;
    A(){ cout << "A\n"; a = 5; b = 'a'; } 
    ~A(){ cout << "~A\n"; }
};

A *a = (A*)operator new(sizeof(A)); //allocates 8 bytes and return void*
A *b = new A(); //allocates 8 bytes, invoke a default constructor and return A*

你能否提供他们之间的所有差异?他们以不同的方式工作吗?

2 个答案:

答案 0 :(得分:2)

new-expression分配所需的内存为新分配的对象调用相应的构造函数(给定参数)。

new(std::size_t) operator只是分配内存。

http://www.cplusplus.com/reference/new/operator%20new/

了解详情

答案 1 :(得分:1)

new表达式调用分配函数operator new。分配函数获取内存,new表达式将内存转换为对象(通过构造它们)。

以下代码:

T * p = new T(1, true, 'x');
delete p;

等同于以下操作序列:

void * addr = operator new(sizeof(T));   // allocation

T * p = new (addr) T(1, true, 'x');      // construction

p->~T();                                 // destruction

operator delete(addr);                   // deallocation

请注意,始终需要new表达式来创建对象(即调用构造函数) - 构造函数没有名称且无法直接调用。在这种情况下,我们使用默认的placement-new表达式,它除了创建对象之外什么都不做,不同于非放置形式,它同时执行内存分配和对象构造。