';何时调用构造函数;新';C+中的运算符+; < >我开始学习C++,我总是读到“新”操作符在返回指针到分配的内存之前调用对象的构造函数。
因此,出于好奇,我检查了“new”的源代码,在 我没有看到调用任何构造函数或任何类型的机制来标识对象的类型 那么,这是如何做到的?编译器通过调用分配内存上的构造函数来玩一些把戏吗?任何帮助都将不胜感激 另外,如果是新的[](在下面的链接中),则不进行任何条目来跟踪数组中的元素数量。那么,delete[]如何知道要销毁多少元素呢 我浏览了很多相关的问题,也在谷歌上搜索了一下,但找不到答案 编译器通过调用分配内存上的构造函数来玩一些把戏吗 是的,上面看到的';何时调用构造函数;新';C+中的运算符+; < >我开始学习C++,我总是读到“新”操作符在返回指针到分配的内存之前调用对象的构造函数。,c++,constructor,new-operator,C++,Constructor,New Operator,因此,出于好奇,我检查了“new”的源代码,在 我没有看到调用任何构造函数或任何类型的机制来标识对象的类型 那么,这是如何做到的?编译器通过调用分配内存上的构造函数来玩一些把戏吗?任何帮助都将不胜感激 另外,如果是新的[](在下面的链接中),则不进行任何条目来跟踪数组中的元素数量。那么,delete[]如何知道要销毁多少元素呢 我浏览了很多相关的问题,也在谷歌上搜索了一下,但找不到答案 编译器通过调用分配内存上的构造函数来玩一些把戏吗 是的,上面看到的操作符new只是获取内存块部分的实现。在代
操作符new
只是获取内存块部分的实现。在代码中使用new T
时,编译器会调用相应的运算符new(size\u T)
实现来获取内存块,然后在其上调用T
构造函数
我没有看到调用任何构造函数或任何类型的机制来标识对象的类型
操作符new
函数的工作就是分配内存;它不调用构造函数,甚至不知道将在内存中构造什么类型的对象(如果有的话)。它只是告诉你要分配多少字节
编译器通过调用分配内存上的构造函数来玩一些把戏吗
如果“玩一些把戏”,你的意思是“生成一些代码”,那么是的。如果使用新的
-表达式创建对象,则它会执行两项操作:
- 调用
为对象分配足够的内存李>操作符new()
- 调用构造函数来初始化该内存中的对象
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;
}