operator new的参数

4
我正在尝试为特定类编写自定义分配器。我的分配器经验基本上没有,所以这可能是显而易见的。
我希望我的分配取决于某些参数。粗略地说,我希望有多个内存管理器,每个管理一些对象。在创建对象时,我将知道对象应属于哪个管理器。在研究了大量关于重载operator new的内容后,我不知道如何实现我所需的功能。 此页面称有一个接受用户定义参数的operator new版本,但似乎在使用new分配对象时不会调用此版本。能否指出如何构造除全局分配器外的其他分配器?另外,如果我正在使用重载的类特定operator new,如何调用带参数的构造函数?

你必须编写自定义的 operator new 重载吗?STL 使用分配器类,可以作为模板参数传递,而不是直接调用 new - Brian Bi
我需要它们用于不使用STL类的自定义数据结构。templatetypedef似乎有答案。 - SPMP
1个回答

8

您可以通过定义 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);

我一直以为放置 new 只适用于不需要新内存的情况。我错了吗? - SPMP
上面的代码实际上并不是用于放置 new。放置 new 是 operator new 的一个特定重载,调用它的语法看起来很像调用上面的分配器,因为它们都使用相同的语言特性。不过你说得对,放置 new 适用于已经有内存空间的情况。 - templatetypedef
2
看到这个,我感觉placement new只是其中一种版本,其中“额外参数”是指向已分配内存位置的指针。正确吗? - SPMP
1
@user2308211: 的确,nothrow-new 是另一个例子。 - ildjarn
“placement new” 既用于带参数的一般 new 操作((stuff) 是语法中的 new-placement),也用于指特定的保留形式,即接受 void* 参数的 placement new。 - T.C.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接