我们可以重载 malloc() 吗?

Pra*_*mar 2 c++ malloc overloading new-operator

我经历了重载newdelete ,我在一本书上读到newmalloc之间的区别在于new调用构造函数,返回调用变量的类型,第三个区别是我们可以逐类重载new ,而malloc不能,有人可以按类基础解释这个类吗?

Pot*_*ter 5

::operator new全局命名空间中的内容可以被替换(覆盖),不能被重载。这会导致使用覆盖而不是标准库提供的函数。并且my_class::operator new可以被提供,因此它将在new my_class表达式中使用,这也与重载不同。

new仅当您使用放置语法时,重载才会发挥作用new

new ( memory_pool, 123, other_args ) my_class( constructor_args )
Run Code Online (Sandbox Code Playgroud)

在关键字后面的括号中提供额外的参数会导致调用new另一个重载,并在指定需要多少内存之后附加额外的参数。operator newsize_t

您当然可以::malloc像任何其他函数一样重载,通过定义采用不同参数的版本:

void *malloc( std::size_t size, allocation_pool &pool );
Run Code Online (Sandbox Code Playgroud)

这只是一个恰好被调用的新函数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.
Run Code Online (Sandbox Code Playgroud)

您还可以专门化std::allocator< my_class >及其成员函数allocate。然后,各种标准库设施将调用您的函数,尽管没有自定义new. new(由于其怪癖,您可能会避免过于深入地了解习惯。)