背景是: 将包含类型T的容器和char * p写入内存区域。让我们假设指针已经适合于类型T对齐 - 对齐问题不是问题的一部分。 如何在该内存区域上默认构造元素?
((*T)(p))->T();
适用于类,但不适用于某些内置类型。
((*T)(p)) = 0; // or simply memset
表示整数类型,指针。 这两个涵盖了一切,工会和什么不是? 是否有最佳实践或某些标准库功能? std :: allocator :: construct可以做到这一点,例如, std :: vector使用,但它不是静态方法,所以我需要它的一个实例。是否有一些独立或静态功能可以做到这一点?
- 编辑 -
是的,答案很明显,今天我很蠢 - 安置新的 顺便说一句,现在我试图摧毁这个元素......
答案 0 :(得分:3)
“Placement new”是要寻找的术语。它是一个标准的库operator new
重载,它实际上并不分配内存,只是返回传递给它的指针。
答案 1 :(得分:3)
包含<new>
标头并使用其放置新分配功能,如下所示:
::new (p) T()
::
资格认证可以避免选择特定于类的分配函数。
paranthesis (p)
是分配函数的参数列表。
这个分配函数只返回传入的指针。
要对事物迂腐,你也应该将指针指向void*
,以避免在全局命名空间中找到一些假设的其他operator new
。
问题中显示的代码((*T)(p))->T();
不应编译。该标准明确指出构造函数没有名称。所以它不能像普通函数那样被调用。