c++ - 我们可以重载 malloc() 吗?

标签 c++ malloc overloading new-operator

我经历了重载 newdelete,我在一本书中读到 newmalloc 是 new 调用构造函数,返回调用变量的类型,第三个区别是我们可以逐个类地重载 new,而 malloc 不能,有人也可以按类(class)解释这个类(class)吗。

最佳答案

::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,因为它有怪癖。)

关于c++ - 我们可以重载 malloc() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16270891/

相关文章:

c++ - 在 Visual Studio2010 中通过 C++ 优化(由编译器完成)的无限循环示例

c++创建一个类,调用它的函数并在一条语句中推回 vector

c++ - 类间比较

c - 如何打印指针指向的字节的二进制内容?

c - 为什么 apr_palloc 比 malloc 快?

c++ - 使用模板重载功能

C++ 重载:字符串文字与 boost::function 歧义

c++ - C++错误C2440 : '=' : cannot convert from 'const int' to 'int *' [closed]

token 方法的 C 段故障 : Possible malloc error?

.net - 重载方法时返回不同类型是一种不好的做法吗?