什么是 C++ 中的就地构造函数? [复制]

Posted

技术标签:

【中文标题】什么是 C++ 中的就地构造函数? [复制]【英文标题】:What is an in-place constructor in C++? [duplicate] 【发布时间】:2011-04-15 09:33:42 【问题描述】:

可能重复:C++'s “placement new”

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

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

【问题讨论】:

这也称为 placement new,您可能更有机会找到该名称的信息。 【参考方案1】:

这称为放置新操作符。它允许您提供将分配数据的内存,而无需 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);

【讨论】:

是的。另请参阅this answer,了解 new 表达式 和实际内存分配之间的区别。 "new 将不再分配。" - 对于作为固定大小的对象的对象 - 当然,但如果对象需要它,它当然会分配动态内存 - 字符串,帧缓冲区,数据库等等。 是否允许析构函数使用free()释放通过malloc分配给对象的内存?我假设答案是肯定的。但是,这有什么问题吗? @thegreatcoder 是的。这就是应该发生的事情。我会更新答案。 确保包含标题<new>!【参考方案2】:

简短的回答是您的代码在y 指向的空间中构造了一个对象。长答案最好由C++ FAQ 覆盖。

【讨论】:

【参考方案3】:

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

http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于什么是 C++ 中的就地构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥就地成员初始化在 C++11 中使用复制构造函数?

复制构造函数中的c ++用户定义成员

C++——构造函数析构函数以及复制构造函数

为啥Java没有复制构造函数?

c++ 类的复制函数

C++中复制构造函数被调用的三种情况