“新”与“操作员新”之间的关系

时间:2015-03-25 07:38:07

标签: c++ new-operator internals

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

当我们调用运算符时会发生什么?简单解释一下。

2 个答案:

答案 0 :(得分:0)

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

新运营商主要做两件事:

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

    1. 它调用构造函数来初始化已分配的内存中的对象。
  2. 现在这个“新”正在调用哪个函数?

    这是操作员新的。

    void * operator new (size_t size);
    

    返回类型为void *。 由于此函数返回一个指向raw的指针,该指针未被打字,未初始​​化的内存大到足以容纳指定类型的对象。 size_t指定要分配的内存量。

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

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

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

答案 1 :(得分:0)

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

然后将该构造函数的结果(对象的地址)放入ptr变量中,该变量可能存在于许多不同的存储区域(例如静态存储区域或堆栈中)之一,具体取决于在代码中 的那个语句的位置。

这真的是你需要知道的,“在”下面的所有内容都是一个实现细节。

operator newnew之间的差异而言,前者在较低的抽象层运行,只需分配足够的内存来存储某些东西,而不是调用任何构造函数。