运算符在C++中何时调用'new'构造函数
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[] 如何知道要销毁多少个元素呢?
http://gcc.gnu.org/viewcvs/gcc/trunk/libstdc%2B%2B-v3/libsupc%2B%2B/new_opv.cc?revision=195701&view=markup
我在SO上浏览了许多相关问题,也用谷歌搜索了一下,但找不到答案。
我没有看到任何被调用的构造函数或任何类型的机制来识别对象的类型。
operator new
函数的工作只是分配内存;它不调用构造函数,甚至不知道将在内存中构造什么类型的对象(如果有的话)。它只是被告知要分配多少字节。
编译器是否通过在分配的内存上调用构造函数来玩一些技巧?
如果"玩一些把戏",你的意思是"生成一些代码",那么是的。如果使用 new
-表达式创建对象,则它会执行两项操作:
- 调用
operator new()
为对象分配足够的内存; - 调用构造函数以初始化该内存中的对象。
此外,如果是 new[](在下面的链接中),则不会创建任何条目来跟踪数组中的元素数量。那么,delete[] 如何知道要销毁多少个元素呢?
new[]
表达式(不是operator new[]
)将在某处记录。确切的细节留给实现。
编译器是否通过在分配的内存上调用构造函数来玩一些技巧?
是的,上面看到的operator new
只是获取内存块的部分的实现。在代码中使用new T
时,编译器会调用相应的operator new (size_t)
实现来获取内存块,然后对其调用T
构造函数。
- 运算符 new 的执行顺序和构造函数的参数
- 使用复制构造函数初始化 new[]
- 在执行new期间是否可以在构造函数中传递不同的参数?
- 双指针在使用 new 时不调用对象构造函数
- 在 new 关键字中,由默认构造函数初始化的类中的元素是否也使用 new 关键字在C++?
- 使用 "new" 命令在 C++ 中的类构造函数中分配 2D 数组
- new[] / delete[] 并在C++中抛出构造函数/析构函数
- 构造函数不会将使用 new 初始化的数组作为参数
- "new"运算符是否总是调用构造函数?
- 重载运算符 new(),为什么构造函数被调用两次?
- 我应该使用<Object> shared_ptr myObject = (shared_ptr) <Object>new Object() 来访问私有构造函数吗?
- 如何安全地将 new 创建的对象传递到构造函数中
- 如果所述结构具有构造函数,则带有 new[] 的结构数组似乎不起作用
- C++构造函数中的'new auto'
- 构造函数中的 Malloc 在通过 New 调用时返回 NULL
- 访问std :: MAP中的静态构造函数New New拨号
- 尝试在没有new的情况下使用我的自定义类构造函数
- 为什么智能指针不能在其构造函数中为我调用 new()?
- 运算符在C++中何时调用'new'构造函数
- 奇怪的'new'构造函数