2013-10-19 58 views
1

自从我开始学习C++以来,我一直认为在将指针返回给分配的内存之前,'new'运算符会调用对象的构造函数。什么时候在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; 
    } 

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

那么,这是如何完成的?编译器是否通过调用分配内存上的构造函数来玩一些技巧?任何帮助将不胜感激。

此外,如果是新的[](在下面的链接),没有条目正在跟踪数组中的元素数量。那么,如何删除[]知道有多少元素被破坏?

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

我经历了许多相关的问题继续SO,也GOOGLE了它,但无法找到答案。

+0

非常感谢Mike和Alexander。因此,在编译期间,编译器必须添加额外的代码以在删除的情况下调用构造函数和析构函数。我的理解是否正确? – Rommel

回答

2

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

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

编译器是否通过调用分配内存上的构造函数来玩一些技巧?

如果通过“玩一些技巧”,你的意思是“生成一些代码”,那么是的。如果使用new -expression创建一个对象,那么它做了两两件事:

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

另外,在新的[](在下面的链接)的情况下,没有条目正在取得跟踪数组中元素的数目。那么,如何删除[]知道有多少元素被破坏?

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

+0

+1,用于明确区分'operator new'和'new'-expression(为进一步挖掘提供良好的OP指针)。 – syam

0

该编译器通过调用分配的内存中构造玩一些把戏?

是,即上方观察operator new仅仅是得到存储块中的一部分的实施。在代码中使用new T时,编译器会调用相应的operator new (size_t)实现来获取内存块,然后调用其上的构造函数T

相关问题