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

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

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

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

【问题讨论】:

  • 这也称为 placement new,您可能更有机会找到该名称的信息。

标签: c++ constructor placement-new in-place


【解决方案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++ 常见问题解答(在“析构函数”区域)对此进行了很好的讨论:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-12-18
            • 2014-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-29
            相关资源
            最近更新 更多