28

可能的重复:
C++ 的“新位置”

什么是 C++ 中的就地构造函数?

例如Datatype *x = new(y) Datatype();

4

6 回答 6

48

这称为放置新操作符。它允许您提供将分配数据的内存,而无需new操作员分配它。例如:

Foo * f = new Foo();

以上将为您分配内存。

void * fm = malloc(sizeof(Foo));
Foo *f = new (fm) Foo(); 

以上将使用调用分配的内存mallocnew不会再分配了。但是,您不仅限于课程。您可以将放置新运算符用于您将通过调用分配的任何类型new

Placement new 的一个“陷阱”是您不应该delete释放使用关键字调用placement new 运算符分配的内存。您将通过直接调用析构函数来销毁对象。

f->~Foo();

手动调用析构函数后,就可以按预期释放内存。

free(fm);
于 2010-09-21T19:48:07.930 回答
7

简短的回答是您的代码在y. C++ FAQ最好地涵盖了长答案。

于 2010-09-21T19:47:38.113 回答
4

这通常被称为“新放置”,并且在 C++ 常见问题解答(在“析构函数”区域)中进行了很好的讨论:

它允许您在原始内存中构造对象,这在某些特殊情况下很有用,例如当您可能想为大量可能的对象分配一个数组,但又想根据需要进行构造,因为您通常可能不需要接近最大值的任何地方,或者因为您想要或需要使用自定义内存分配器。

于 2010-09-21T19:48:34.757 回答
2

我对此感到生疏,但它允许您将对象写入您已经分配的内存块。它还需要一个相互删除语句来从内存中清除它。

于 2010-09-21T19:46:31.917 回答
2

如果您使用内存池,那么您需要使用就地构造函数来初始化您的对象,因为它们是从池中分配的。

于 2010-09-21T19:46:48.200 回答
1

这是一种在不分配内存的情况下调用构造函数的方法。你y必须是一个指针,指向一个新的 Datatype 对象的足够内存。另外,不要打电话delete,打电话~DataType()

于 2010-09-21T19:47:21.410 回答