【问题标题】:Relation between "new" and "operator new" [closed]“新”和“新运营商”之间的关系[关闭]
【发布时间】:2015-05-28 18:50:05
【问题描述】:
   string *ptr = new string("Hello");

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

【问题讨论】:

  • 我非常怀疑您的问题是否适合本网站。请咨询:stackoverflow.com/help/how-to-ask。有礼貌也有帮助。
  • 你自己研究过什么,你到底有什么不明白的?由于这是一个相当初级的问题,我假设您正在从good book 或教程中学习。那里是如何解释的,解释的哪些部分不清楚?

标签: c++ new-operator internals


【解决方案1】:

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

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

这就是你需要知道的全部内容,所有“下”都是实现细节。

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

【讨论】:

    【解决方案2】:
    string *ptr = new string("Hello");
    

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

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

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

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

    是运算符new。

    void * operator new (size_t size);
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-07
      • 1970-01-01
      • 2012-05-10
      • 2012-01-21
      • 1970-01-01
      • 2021-06-27
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多