运算符 new 的参数

SPM*_*PMP 3 c++ memory-management c++11

我正在尝试为特定类编写自定义分配器。我对分配器的经验基本上没有,所以这可能很明显。

我希望我的分配取决于某些参数。粗略地说,我希望有多个内存管理器,每个管理器管理几个对象。创建对象时,我将知道该对象应该属于哪个管理器。在阅读了大量关于重载的内容后operator new,我不知道如何实现我需要的东西。

这个页面说有一个版本operator new可以接受用户定义的参数,但似乎在使用new. 有人能指出如何构造除全局分配器以外的任何东西吗?在相关说明中,如果我使用重载的类特定的,如何调用参数化构造函数operator new

tem*_*def 6

您可以通过定义一个重载来创建一个自定义的分配器,该分配器接收额外的参数,operator new如下所示:

void* operator new (size_t size, /* extra parameters here */) {
    /* Do something, then return a pointer to at least 'size' bytes. */
}
Run Code Online (Sandbox Code Playgroud)

然后您可以通过编写使用您的分配器

MyObject* obj = new (/* extra params */) MyObject(/* constructor args */);
Run Code Online (Sandbox Code Playgroud)

例如,这是一个愚蠢的自定义分配器,它在您分配一些东西时打印出一条消息:

void* operator new(size_t numBytes, const std::string& message) {
    std::cout << "Custom message: " << message << std::endl;

    /* Use the default allocator to get some bytes. */
    return ::operator new(numBytes);
}
Run Code Online (Sandbox Code Playgroud)

你可以通过写作来调用它

std::complex<double>* obj = new ("Hello, world!") std::complex<double>(0.0, 0.0);
Run Code Online (Sandbox Code Playgroud)

  • 看着这个,我觉得placement new 只是这个版本的一个版本,其中“额外参数”是一个指向已经分配的内存位置的指针。正确的? (2认同)