放置新的和非默认的构造函数

Chr*_*ton 12 c++ placement-new new-operator

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

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

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

CFoo* foo = new (pChunkOfMemory) CFoo(42);
Run Code Online (Sandbox Code Playgroud)

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

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

GMa*_*ckG 19

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

#include <new>
Run Code Online (Sandbox Code Playgroud)

否则,operator new未定义放置形式.

  • 包括`<new>`是OP问题的实际答案,但上面第一行给出的信息是不正确的.一个不需要icnlude`new`,但必须定义相关的`operator new`分配函数(作为成员或全局命名空间).对于OP:为了确保使用全局分配函数,在使用"现场构造"放置时,通常应该编写`:: new`,而不仅仅是`new`; 否则你可能会选择一个成员分配功能. (4认同)