::operator new在全局命名空间中可以被替换(覆盖),而不是重载。这会导致使用覆盖而不是标准库提供的函数。并且my_class::operator new可以提供,因此它将在new my_class表达式中使用,这也与重载不同。
仅当您使用放置语法时,重载new才会发挥作用:new
new ( memory_pool, 123, other_args ) my_class( constructor_args )
在关键字之后的括号中提供额外的参数new会导致调用另一个重载,并在指定需要多少内存operator new之后附加额外的参数。size_t
你当然可以::malloc像任何其他函数一样重载,通过定义一个接受不同参数的版本:
void *malloc( std::size_t size, allocation_pool &pool );
这只是一个碰巧被调用的新函数malloc。但是最好使用明确的std::限定来调用库函数,并且添加std::malloc重载将违反库的规则。
你不能换std::malloc。唯一可以替换的功能是::operator new. 没有特定于类的东西,malloc因为它不接受指示哪个类将进入返回的内存块的参数。malloc不知道你将如何处理返回的内存;它只是一团字节。
作为程序组织的问题,可能应该给出一个更专业的分配器并将其称为另一个名称,而不是malloc. 如果您需要根据类型调用不同的函数,请使用模板,例如
template< typename allocated >
void *my_allocate( std::size_t sz ); // maybe "sz" param is unnecessary.
您还可以专门std::allocator< my_class >化及其成员函数allocate。然后各种标准库工具将调用您的函数,尽管没有自定义new. new(由于它的怪癖,您可能会避免过于深入地了解习惯。)