我想了解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*
你能否提供他们之间的所有差异?他们以不同的方式工作吗?
答案 0 :(得分:2)
new-expression
分配所需的内存和为新分配的对象调用相应的构造函数(给定参数)。
new(std::size_t) operator
只是分配内存。
答案 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表达式,它除了创建对象之外什么都不做,不同于非放置形式,它同时执行内存分配和对象构造。