运算符new的参数

时间:2016-01-14 22:23:41

标签: c++ c++11 memory-management

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

我希望我的分配依赖于某些参数。粗略地说,我希望有多个内存管理器,每个内存管理器管理一些对象。在创建对象时,我将知道对象应该属于哪个管理器。在阅读了operator new重载之后,我很遗憾我是如何实现我需要的。

This page表示有operator new版本接受用户定义的参数,但似乎在使用new分配对象时不会调用此版本。有人可以指出如何构建除全局分配器之外的任何东西吗?在相关的说明中,如果我使用重载的特定于类的operator new,如何调用参数化构造函数?

1 个答案:

答案 0 :(得分:4)

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

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

然后您可以通过编写

来使用您的分配器
MyObject* obj = new (/* extra params */) MyObject(/* constructor args */);

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

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);
}

您可以通过编写

来调用它
std::complex<double>* obj = new ("Hello, world!") std::complex<double>(0.0, 0.0);