"new" 和 "operator new" 之间的关系

Relation between "new" and "operator new"

   string *ptr = new string("Hello");

当我们调用 new 运算符时会发生什么?简明扼要地解释一下。

string *ptr = new string("Hello");

new操作符主要做了两件事:

  1. 它分配了足够的内存来容纳请求类型的对象。 (在上面的例子中,它分配了足够的内存来容纳这个字符串对象)

    1. 它调用构造函数来初始化分配的内存中的对象。

现在这个“新”正在调用哪个函数?

它是新的运营商。

void * operator new (size_t size);

return 类型为 void*。 因为这个函数 returns 是一个指向 raw 的指针,它没有类型化并且未初始化的内存足够大以容纳指定类型的对象。 size_t 指定要分配多少内存。

如果我们直接调用 operator new ,它 return 是一个指向足以容纳字符串对象的内存块的指针。

void *pointRawMemory = operator new(sizeof(string));

operator new 类似于malloc。它只负责分配内存。它对构造函数一无所知。 “new”运算符的工作是获取 operator new returns 的原始内存并将其变成一个对象。

在动态存储区中分配了一个字符串对象并调用了它的构造函数(接收const char *的那个)。

然后将那个构造函数的结果(对象的地址)放入ptr变量中,这个变量可能存在于很多不同的存储区之一(比如静态存储区或者栈上) ,取决于该语句在您的代码中 实际 的位置。

这就是您真正需要了解的所有内容,所有 "under" 实施细节。

operator newnew的区别而言,前者在较低的抽象层次上运行,只是分配足够的内存来存储一些东西,而不调用任何构造函数。