【问题标题】:Placement new and non-default constructors放置新的和非默认的构造函数
【发布时间】:2010-10-11 22:26:19
【问题描述】:

我可以在带有参数的构造函数上调用 C++ 放置 new 吗?我正在实现一个自定义分配器,并希望避免将功能从非默认构造函数移动到 init 函数中。

class CFoo
{
public:
    int foo;
    CFoo()
    {
        foo = 0;
    }

    CFoo(int myFoo)
    {
        foo = myFoo;
    }
};

CFoo* foo = new (pChunkOfMemory) CFoo(42);

我希望使用第二个构造函数在 pChunkOfMemory 构造一个 CFoo 类型的对象。使用 operator new 时,我是否只使用默认构造函数?

解决了!我没有#include <new>。在此之后,调用placement ::new 可以在非默认构造函数中正常工作。

【问题讨论】:

  • 是 - 错误 C2660:'operator new':函数不采用 2 个参数。你有这个问题的答案吗?
  • 没有构造函数参数的新放置是否在相同的上下文中工作?你还记得#include <new>吗?
  • 毕竟我没有包含 !谢谢。

标签: c++ new-operator placement-new


【解决方案1】:

要使用placement new,您需要包含标题<new>

#include <new>

否则operator new的放置形式不定义。

【讨论】:

  • 成功!我不敢相信我整天都在为此苦苦挣扎,这是一个丢失的包含文件。哦!感谢 GMan 和 aschelper。
  • @Chris:是的。很容易忘记这些小标题,因为它们经常被其他几乎总是包含的标题包含在内。
  • 包括&lt;new&gt; 是对OP问题的实际答案,但上面第一行中给出的信息不正确。不需要icnludenew,但必须定义相关的operator new分配函数(作为成员或在全局命名空间中)。致 OP:为确保使用全局分配功能,当使用“就地构造”放置新时,您通常应该写::new,而不仅仅是new;否则你可能会选择一个成员分配函数。
  • @Alf:公平,尽管我怀疑绕过成员 operator new 是最好的意图。
猜你喜欢
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
  • 2016-07-23
  • 2019-01-27
  • 2015-10-20
  • 1970-01-01
  • 2014-03-26
相关资源
最近更新 更多