为什么我会在没有存储ptr的情况下调用new?

时间:2014-12-27 01:04:21

标签: c++ c++11 placement-new

今天我正在阅读一些源代码,我遇到了这个

Pool<C> *pool = accomodate_component<C>();
new(pool->get(id.index())) C(std::forward<Args>(args) ...);

这条线让我困惑

new(pool->get(id.index())) C(std::forward<Args>(args) ...);

我甚至认为这是合法的C ++。事实证明,pool->get(id.index())返回的大小告诉我,可以明确地告诉C ++它应该分配多少大小。

我查了一下,是的,它以void* operator new ( std::size_t count );

的方式定义

现在我知道这是合法的C ++,但我不知道的是它的目的。

为什么我会打电话给new(size) Foo();。难道这不是内存泄漏吗?它不完全没有意义吗?如果我没有ptr我将如何访问它?

1 个答案:

答案 0 :(得分:6)

这是调用placement new,它将对象放入括号中指定的位置。对于广义union s容纳类类型,我希望放置new得到更广泛的使用:将标记更改为构建对象所需的类类型,可能使用placement {{1 (显然,在手动销毁之前位于该点的任何对象后,如果有的话)。

由于new带有展示位置new的ed对象的位置很容易知道,因此不需要捕获其地址。由于放置new失败的唯一方法是从新创建的对象的构造函数抛出异常,因此检查结果也没有意义。