【发布时间】:2011-04-15 09:33:42
【问题描述】:
【问题讨论】:
-
这也称为 placement new,您可能更有机会找到该名称的信息。
标签: c++ constructor placement-new in-place
【问题讨论】:
标签: c++ constructor placement-new in-place
这称为放置新操作符。它允许您提供将分配数据的内存,而无需 new 运算符分配它。例如:
Foo * f = new Foo();
上面会为你分配内存。
void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo();
上面将使用调用malloc分配的内存。 new 将不再分配。但是,您不仅限于课程。您可以对通过调用new 分配的任何类型使用placement new 运算符。
placement new 的一个“陷阱”是您不应该释放由使用 delete 关键字调用placement new 运算符分配的内存。您将通过直接调用析构函数来销毁对象。
f->~Foo();
手动调用析构函数后,就可以按预期释放内存了。
free(fm);
【讨论】:
new 将不再分配。" - 对于作为固定大小的对象的对象 - 当然,但如果对象需要它,它当然会分配动态内存 - 字符串,帧缓冲区,数据库等等。
<new>!
简短的回答是您的代码在y 指向的空间中构造了一个对象。长答案最好由C++ FAQ 覆盖。
【讨论】:
这通常被称为“新放置”,C++ 常见问题解答(在“析构函数”区域)对此进行了很好的讨论:
它允许您在原始内存中构造对象,这在某些特殊情况下很有用,例如当您可能想为大量可能的对象分配一个数组,但又想根据需要构造时,因为您经常可能不需要接近最大值,或者因为您想要或需要使用自定义内存分配器。
【讨论】:
我对这个有点生疏,但它允许您将对象写入您已经分配的内存块。它还需要一个相互删除的语句来从内存中清除它。
【讨论】:
如果您使用内存池,那么您需要使用就地构造函数来初始化您的对象,因为它们是从池中分配的。
【讨论】:
这是一种在不分配内存的情况下调用构造函数的方法。您的 y 必须是指向足够内存以供新 Datatype 对象使用的指针。另外,不要打电话delete,打电话~DataType()。
【讨论】: