给定一个未知类型的对齐和大小,如何安全地构建正确对齐的空闲存储(堆(?
上下文:自动存储版本有很好的文档记录。请参阅上的示例https://en.cppreference.com/w/cpp/types/aligned_storage:堆栈上不透明的未初始化存储可以正确对齐,一旦类型已知,就可以稍后放置新的存储。
是否可以类似地在堆上进行对齐安全的未初始化分配?一旦类型已知(并在类型感知上下文中删除,并进行适当的销毁等(,该存储稍后将进行新的初始化
以下天真的尝试失败了:https://godbolt.org/z/PM1xWoYox
堆存储的心理模型是什么?
考虑到new
和delete
存在的问题,您可以考虑使用aligned_alloc
和free
。例如:
#include <cstdlib>
#include <new>
struct Foo
{
Foo (double d) : m_d (d) {}
double m_d;
};
int main ()
{
void *storage = aligned_alloc (alignof (Foo), sizeof (Foo));
Foo* foo = new (storage) Foo (3.14);
...
foo->~Foo ();
free (storage);
}
请注意,要销毁由放置new
创建的对象,必须显式调用析构函数。你不叫delete
。然后必须释放底层存储。