鉴于
std::malloc
和 ::operator new
返回原始内存,其中没有任何对象,我们如何继续使用返回的内存区域?
我知道使用该内存区域的 3 种方法:
std::memcpy
从此区域读取和写入字节placement new
启动该区域中某些对象的生命周期,并始终使用 placement new
的返回值来访问这些对象。static_cast
将区域转换为正确的类型并使用结果。使用
std::memcpy
仅对于普通可复制类型是合法的,并且使用 placement new
应该对于所有类型都合法(如果我在这里错了,请纠正我)。
static_cast
对我来说似乎有点不确定,标准是否允许这种根据给定标准访问某些类型的内存区域的方法?
(这不是何时使用手动内存管理的问题,应该避免,但有时对于实现分配器和容器是必要的)。
两种有效的方法是:
constexpr
)std::construct_at
(constexpr
)另外两个很难做对,所以我避开它们。