![](/img/trans.png)
[英]C++ class constructor is called twice when new operator is overriden - why
[英]When is the constructor called by 'new' operator in C++
自从我开始学习C ++以来,我总是读到'new'运算符在将指针返回到分配的内存之前会调用对象的构造函数。
因此,出于好奇,我检查了源代码中的“ 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 []如何知道要销毁多少元素?
我在SO上经历了许多相关问题,并在Google上进行了搜索,但找不到答案。
我看不到任何构造函数被调用或任何类型的机制来标识对象的类型。
operator new
功能的工作只是分配内存; 它不调用构造函数,甚至不知道将在内存中构造哪种类型的对象(如果有)。 只是告诉您要分配多少字节。
编译器通过在分配的内存上调用构造函数来发挥作用吗?
如果说“玩些花样”是指“生成一些代码”,那么是的。 如果使用new
-expression创建对象,那么它会做两件事:
operator new()
为该对象分配足够的内存; 同样,在new []的情况下(在下面的链接中),不会进行任何记录来跟踪数组中元素的数量。 那么,delete []如何知道要销毁多少元素?
new[]
表达式(不是operator new[]
)会将其记录在某处。 确切的细节留给实现。
编译器通过在分配的内存上调用构造函数来发挥作用吗?
是的,上面看到的operator new
只是获取内存块的部分的实现。 在代码中使用new T
时,编译器将调用相应的operator new (size_t)
实现来获取内存块,然后在其上调用T
构造函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.