如何实现C++"新"运算符

vam*_*msi 6 c++ new-operator

Class B;
B *b  = new B();       // default constructor
B *b1 = new B(10);     // constructor which takes an argument B(int x)
Run Code Online (Sandbox Code Playgroud)

但是,如果我们要编写自定义版本new,则语法为

Class B
{
  /*...*/
  static void* operator new(size_t size);
}
Run Code Online (Sandbox Code Playgroud)

如何将语句new B()转换为函数调用 operator new(sizeof(B))

它如何跟踪调用哪个构造函数,即它如何区分new B()new B(int x)

new实现为C++中的宏?

iam*_*ind 7

你的问题应该是:

编译器如何区分new B()new B(10),当B::operator new语法相同时?

好吧,new 只需分配内存,然后编译器立即将调用插入构造函数.所以这是无论如果你打电话new B,new B()或者new B(10).

编译器解释如下:

B *b = static_cast<B*>(B::operator new(sizeof(B)))->B();
B *b1 = static_cast<B*>(B::operator new(sizeof(B)))->B(10);
Run Code Online (Sandbox Code Playgroud)

实际上,构造函数不返回任何内容.但是上面的伪代码只是内部东西的类比表示.

  • 对于某些类型,`new T`和`new T()`之间存在差异.并且`operator new`是一个只分配内存的东西 - 普通的`new`同时进行分配和构造,所以说它只分配是错误的.如@Jon所提到的那样,还有一个只放置构造的"new"(因为你不能直接调用构造函数). (3认同)