自从我开始学习 C++ 以来,我一直读到“new”运算符在返回指向分配内存的指针之前调用对象的构造函数。
因此,出于好奇,我检查了“new”的源代码,并在以下位置找到了以下内容
_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[] 如何知道要销毁多少个元素呢?
我浏览了很多关于SO的相关问题,也用谷歌搜索了它,但找不到答案。
我没有看到任何构造函数被调用或任何类型的机制来识别对象的类型。
的工作operator new
功能只是分配内存;它不调用构造函数,甚至不知道将在内存中构造什么类型的对象(如果有)。它只是告诉要分配多少字节。
编译器是否通过在分配的内存上调用构造函数来玩一些花招?
如果“玩点把戏”的意思是“生成一些代码”,那么是的。如果您使用new
-表达式创建一个对象,然后它做了两件事:
- Calls
operator new()
为对象分配足够的内存;
- 调用构造函数来初始化该内存中的对象。
此外,在 new[] 的情况下(在下面的链接中),不会创建任何条目来跟踪数组中的元素数量。那么,delete[] 如何知道要销毁多少个元素呢?
The new[]
表达式(不operator new[]
)会在某个地方记录下来。确切的细节留给实施。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)