什么是 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++ 中的就地构造函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章