使用 std::malloc (和 ::operator new)的返回值的合法正确方法是什么?

问题描述 投票:0回答:1

鉴于

std::malloc
::operator new
返回原始内存,其中没有任何对象,我们如何继续使用返回的内存区域?

我知道使用该内存区域的 3 种方法:

  • 始终使用
    std::memcpy
    从此区域读取和写入字节
  • 使用
    placement new
    启动该区域中某些对象的生命周期,并始终使用
    placement new
    的返回值来访问这些对象。
  • static_cast
    将区域转换为正确的类型并使用结果。

使用

std::memcpy
仅对于普通可复制类型是合法的,并且使用
placement new
应该对于所有类型都合法(如果我在这里错了,请纠正我)。

static_cast
对我来说似乎有点不确定,标准是否允许这种根据给定标准访问某些类型的内存区域的方法?

(这不是何时使用手动内存管理的问题,应该避免,但有时对于实现分配器和容器是必要的)。

c++ c++17 language-lawyer dynamic-memory-allocation
1个回答
0
投票

两种有效的方法是:

  • 使用新的展示位置(不是
    constexpr
  • 使用
    std::construct_at
    (
    constexpr
    )

另外两个很难做对,所以我避开它们。

© www.soinside.com 2019 - 2024. All rights reserved.