今天我正在阅读一些源代码,我遇到了这个
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我将如何访问它?
答案 0 :(得分:6)
这是调用placement new
,它将对象放入括号中指定的位置。对于广义union
s容纳类类型,我希望放置new
得到更广泛的使用:将标记更改为构建对象所需的类类型,可能使用placement {{1 (显然,在手动销毁之前位于该点的任何对象后,如果有的话)。
由于new
带有展示位置new
的ed对象的位置很容易知道,因此不需要捕获其地址。由于放置new
失败的唯一方法是从新创建的对象的构造函数抛出异常,因此检查结果也没有意义。