【发布时间】:2021-08-25 20:37:13
【问题描述】:
据我所知,一个位置new 不分配内存,而是new 运算符的一种形式,它接受一个指向已分配内存的指针并在那里构造一个对象。
但我对 C++ 入门第 5 版中的这段文字感到非常困惑:
“相反,我们使用
new的放置new形式(第 12.1.2 节,第 460 页)来构造一个对象。正如我们所见,new的这种形式为分配函数。我们可以使用placementnew来传递一个地址,在这种情况下placement new表达式的形式为
new (place_address) type
new (place_address) type (initializers)
new (place_address) type [size]
new (place_address) type [size] { braced initializer list }
其中 place_address 必须是一个指针,并且初始化程序提供(可能为空)逗号分隔的初始化程序列表,用于构造新分配的对象。
当使用地址且没有其他参数调用时,placement new 使用 operator new(size_t, void*) 来“分配”其内存。这是我们不允许重新定义的 operator new 版本(第 19.1.1 节,第 822 页)。该函数不分配任何内存;它只是返回它的指针参数。然后,整个新表达式通过在给定地址初始化一个对象来完成它的工作。实际上,placement new 允许我们在一个特定的、预先分配的内存地址上构造一个对象。
注意
当传递一个指针参数时,placement new 表达式构造一个对象但不分配内存。"
这是什么意思“当使用地址而不是其他参数调用时,放置新用途 operator new(size_t, void*) 来“分配”它的内存。”?这是否意味着placement new 调用一个函数来分配内存?
- 还有注释说,当placement new 被传递一个作为指针的参数时,它会构造一个对象但不分配内存:这是否意味着如果传递多个参数它可以分配内存?
有人可以帮我解决这个问题吗?谢谢!
【问题讨论】:
-
引用后的第二句:此函数不分配任何内存;
-
"当使用地址且没有其他参数调用时,placement new 使用 operator new(size_t, void) 来“分配”它的内存。", 所以是的. *此函数不分配任何内存;它只是返回它的指针参数。所以基本上什么都没有。
-
@SilvioMayolo 嗯,这是The Definitive C++ Book Guide and List 下列出的第一本书:D
-
@ItachiUchiwa Placement new 是 C++ 的表达方式:嘿,在提供的指针指向的位置构造一个我指定的类型的对象。它让您自己决定是否已经分配了所需的空间。
标签: c++ placement-new