【问题标题】:C++ primer 5th edition placement newC++ 入门第 5 版安置新
【发布时间】: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


【解决方案1】:

我认为问题在于new 表达式做了两件事

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

现在,通常情况下,分配内存最终会调用 malloc 或以某种方式向操作系统请求内存。但是,使用新位置,您将“手动”进行第 1 步,而不是调用分配函数来提供内存,而是传入一个指针,您承诺是构造对象的有效位置。它只会使用你给它的内存在你说的地方创建对象。

【讨论】:

    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    相关资源
    最近更新 更多