有没有一种简单的方法在C ++中默认构造泛型类型,而没有分配器实例?

时间:2015-10-15 21:34:00

标签: c++ c++11 containers c++14

背景是: 将包含类型T的容器和char * p写入内存区域。让我们假设指针已经适合于类型T对齐 - 对齐问题不是问题的一部分。 如何在该内存区域上默认构造元素?

((*T)(p))->T();

适用于类,但不适用于某些内置类型。

((*T)(p)) = 0; // or simply memset

表示整数类型,指针。 这两个涵盖了一切,工会和什么不是? 是否有最佳实践或某些标准库功能? std :: allocator :: construct可以做到这一点,例如, std :: vector使用,但它不是静态方法,所以我需要它的一个实例。是否有一些独立或静态功能可以做到这一点?

- 编辑 -

是的,答案很明显,今天我很蠢 - 安置新的 顺便说一句,现在我试图摧毁这个元素......

2 个答案:

答案 0 :(得分:3)

“Placement new”是要寻找的术语。它是一个标准的库operator new重载,它实际上并不分配内存,只是返回传递给它的指针。

答案 1 :(得分:3)

包含<new>标头并使用其放置新分配功能,如下所示:

::new (p) T()

::资格认证可以避免选择特定于类的分配函数。

paranthesis (p)是分配函数的参数列表。

这个分配函数只返回传入的指针。

要对事物迂腐,你也应该将指针指向void*,以避免在全局命名空间中找到一些假设的其他operator new

问题中显示的代码((*T)(p))->T();不应编译。该标准明确指出构造函数没有名称。所以它不能像普通函数那样被调用。