何时由C ++中的'new'运算符调用构造函数

时间:2013-10-19 23:56:29

标签: c++ constructor new-operator

自从我开始学习C ++以来,我一直读到'new'运算符在将指针返回到已分配的内存之前调用对象的构造函数。

所以,出于好奇,我检查了“新”的源代码,我在http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/new_op.cc?revision=197380&view=markup找到了以下内容

_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;
    }

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

那么,这是怎么做到的?编译器是否通过调用分配的内存上的构造函数来发挥一些作用?任何帮助将不胜感激。

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

http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/new_opv.cc?revision=195701&view=markup

我在SO上经历了很多相关的问题并且也用Google搜索了,但是找不到答案。

2 个答案:

答案 0 :(得分:2)

  

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

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

  

编译器是否通过调用分配的内存上的构造函数来发挥一些作用?

如果通过“玩一些技巧”,你的意思是“生成一些代码”,然后是。如果使用new - 表达式来创建对象,那么它会做两件事:

  • 调用operator new()为对象分配足够的内存;
  • 调用构造函数初始化该内存中的对象。
  

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

new[]表达式(不是operator new[])会在某处记录。具体细节留待实施。

答案 1 :(得分:0)

  
    

编译器是否通过调用分配的内存上的构造函数来发挥一些作用?

  

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