2015-10-15 72 views
4

上下文为: 将一个容器(包含T类型)和一个char * p写入内存区域。让我们假设指针已经适合类型T - 对齐问题不是问题的一部分。 如何默认构建该内存区域上的元素?有没有一种简单的方法默认构造C++中的泛型类型,没有分配器实例?

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

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

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

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

- 编辑 -

是的,答案是显而易见的,而我是哑巴今天 - 放置新 顺便说一句,现在我试图破坏元素...

+6

Placement new:'new(p)T();' –

+2

该第一段代码不应该编译... – Brian

+0

请参阅http://stackoverflow.com/questions/222557/what-uses-are-there-for- placement-new – sehe

回答

3

“布局新“是要寻找的术语。这是一个标准库operator new重载,它实际上并没有分配内存,但只是返回您传递给它的任何指针。

+0

这非常类似于评论。事实上,它与已经存在的评论非常相似。 – sehe

+0

@sehe看看时间戳。当评论发布时,我显然已经在输入我的答案。 – hvd

+0

啊,我完全忘记了这一点,它似乎工作。 –

3

附上<new>头,并使用其放置新的分配功能是这样的:

::new (p) T() 

::资质避免拿起类特定的配置功能。

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

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

要琢磨一些你也会把指针指向void*的东西,以避免在全局命名空间中找到一些假设的其他operator new


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

相关问题