【问题标题】:Why would I call new without storing the ptr?为什么我会在不存储 ptr 的情况下调用 new ?
【发布时间】:2014-12-27 01:04:20
【问题描述】:

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

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-&gt;get(id.index()) 返回的大小告诉我可以明确告诉 C++ 它应该分配多少大小。

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

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

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

【问题讨论】:

  • 它的位置是新的。他们不存储指针,因为他们知道放置对象的位置。这种形式的 new 实际上并不分配内存

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


【解决方案1】:

这是调用放置new,它将对象放置到括号中指定的位置。使用通用的unions 适应类类型,我希望放置new 得到更广泛的使用:将标签更改为您需要构造对象的类类型,可能使用放置new(显然,在手动销毁之前位于该位置的任何对象(如果有)。

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

【讨论】:

  • 您能否详细说明或指出一些内容来解释您所说的关于将新位置用于广义工会的内容?我看到 here 使用了相同的技术,但我不明白为什么你需要 case Tag::text: new(&amp;s)(w.s); break; 而不仅仅是 case Tag::text: s = w.s; break;
  • @Pradhan:这不是一个单独的问题吗……?简短的回答是:当标签改变时,该位置没有对象。但是,赋值假定目标对象已设置适当的不变量。这与原始内存的构造和分配之间的区别相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
相关资源
最近更新 更多