我正在尝试为特定类编写自定义分配器。我对分配器的经验基本上没有,所以这可能是显而易见的。
我希望我的分配依赖于某些参数。粗略地说,我希望有多个内存管理器,每个内存管理器管理一些对象。在创建对象时,我将知道对象应该属于哪个管理器。在阅读了operator new
重载之后,我很遗憾我是如何实现我需要的。
This page表示有operator new
版本接受用户定义的参数,但似乎在使用new
分配对象时不会调用此版本。有人可以指出如何构建除全局分配器之外的任何东西吗?在相关的说明中,如果我使用重载的特定于类的operator new
,如何调用参数化构造函数?
答案 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);