';何时调用构造函数;新';C+中的运算符+; < >我开始学习C++,我总是读到“新”操作符在返回指针到分配的内存之前调用对象的构造函数。

';何时调用构造函数;新';C+中的运算符+; < >我开始学习C++,我总是读到“新”操作符在返回指针到分配的内存之前调用对象的构造函数。,c++,constructor,new-operator,C++,Constructor,New Operator,因此,出于好奇,我检查了“new”的源代码,在 我没有看到调用任何构造函数或任何类型的机制来标识对象的类型 那么,这是如何做到的?编译器通过调用分配内存上的构造函数来玩一些把戏吗?任何帮助都将不胜感激 另外,如果是新的[](在下面的链接中),则不进行任何条目来跟踪数组中的元素数量。那么,delete[]如何知道要销毁多少元素呢 我浏览了很多相关的问题,也在谷歌上搜索了一下,但找不到答案 编译器通过调用分配内存上的构造函数来玩一些把戏吗 是的,上面看到的操作符new只是获取内存块部分的实现。在代

因此,出于好奇,我检查了“new”的源代码,在

我没有看到调用任何构造函数或任何类型的机制来标识对象的类型

那么,这是如何做到的?编译器通过调用分配内存上的构造函数来玩一些把戏吗?任何帮助都将不胜感激

另外,如果是新的[](在下面的链接中),则不进行任何条目来跟踪数组中的元素数量。那么,delete[]如何知道要销毁多少元素呢

我浏览了很多相关的问题,也在谷歌上搜索了一下,但找不到答案

编译器通过调用分配内存上的构造函数来玩一些把戏吗

是的,上面看到的
操作符new
只是获取内存块部分的实现。在代码中使用
new T
时,编译器会调用相应的
运算符new(size\u T)
实现来获取内存块,然后在其上调用
T
构造函数

我没有看到调用任何构造函数或任何类型的机制来标识对象的类型

操作符new
函数的工作就是分配内存;它不调用构造函数,甚至不知道将在内存中构造什么类型的对象(如果有的话)。它只是告诉你要分配多少字节

编译器通过调用分配内存上的构造函数来玩一些把戏吗

如果“玩一些把戏”,你的意思是“生成一些代码”,那么是的。如果使用
新的
-表达式创建对象,则它会执行两项操作:

  • 调用
    操作符new()
    为对象分配足够的内存
  • 调用构造函数来初始化该内存中的对象
另外,如果是新的[](在下面的链接中),则不进行任何条目来跟踪数组中的元素数量。那么,delete[]如何知道要销毁多少元素呢


new[]
表达式(不是
operator new[]
)将在某个地方记录这一点。具体细节留待实现。

+1清楚区分
运算符new
new
-表达式(为OP进一步挖掘提供了很好的指针)。非常感谢Mike和Alexander。因此,在编译过程中,编译器必须添加额外的代码,以便在删除时调用构造函数和析构函数。我的理解正确吗?
_GLIBCXX_WEAK_DEFINITION void *
    operator new (std::size_t sz) _GLIBCXX_THROW (std::bad_alloc)
    {
      void *p;

      /* malloc (0) is unpredictable; avoid it.  */
      if (sz == 0)
        sz = 1;
      p = (void *) malloc (sz);
      while (p == 0)
        {
          new_handler handler = std::get_new_handler ();
          if (! handler)
            _GLIBCXX_THROW_OR_ABORT(bad_alloc());
          handler ();
          p = (void *) malloc (sz);
        }

      return p;
    }