C++初级读本第5版新位置



据我所知,放置new不分配内存,而是new运算符的一种形式,它将指针指向已分配的内存并在那里构造对象。

但我对这篇来自C++入门第5版的文章感到困惑:

"相反,我们使用new的放置new形式(§12.1.2,第460页(来构造对象。正如我们所看到的,new的这种形式为分配函数提供了额外的信息。我们可以使用放置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使用运算符new(size_t,void*(来"分配"其内存。这是我们不允许重新定义的运算符new的版本(§19.1.1,第822页(。此函数不分配任何内存;它只是返回指针参数。然后,整个新表达式通过初始化给定地址的对象来完成其工作。实际上,placementnew允许我们在预先分配的特定内存地址上构造对象。

注意

当传递一个指针参数时,placement new表达式会构造一个对象,但不会分配内存">

这意味着什么"当使用地址而没有其他参数调用时,placement new使用运算符new(size_t,void*(来"分配"其内存"?这是否意味着放置new调用一个函数来分配内存?

  • 还有一条注释说,当向placement new传递一个指针参数时,它会构造一个对象,但不会分配内存:这是否意味着如果传递了多个参数,它可以分配内存

有人能给我澄清一下吗?非常感谢。

我认为,问题是new表达式做两件事情:

  1. 通过operator new分配内存
  2. 调用该分配内存中对象的构造函数

现在,通常情况下,分配内存最终会调用malloc或以某种方式向操作系统请求内存。然而,有了新的安置,你就";手动";对于步骤1,不是调用分配函数来提供内存,而是传递一个指针,您承诺该指针是构造对象的有效位置。它只会使用你给它的内存,在你说要制作的地方创建对象

最新更新