未知类型的已对齐堆分配



给定一个未知类型的对齐和大小,如何安全地构建正确对齐的空闲存储(堆(?

上下文:自动存储版本有很好的文档记录。请参阅上的示例https://en.cppreference.com/w/cpp/types/aligned_storage:堆栈上不透明的未初始化存储可以正确对齐,一旦类型已知,就可以稍后放置新的存储。

是否可以类似地在堆上进行对齐安全的未初始化分配?一旦类型已知(并在类型感知上下文中删除,并进行适当的销毁等(,该存储稍后将进行新的初始化

以下天真的尝试失败了:https://godbolt.org/z/PM1xWoYox

堆存储的心理模型是什么?

考虑到newdelete存在的问题,您可以考虑使用aligned_allocfree。例如:

#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。然后必须释放底层存储。

最新更新