我们可以重载malloc()吗?

时间:2013-04-29 03:45:29

标签: c++ malloc overloading new-operator

我经历了重载删除,我在一本书中读到了 new malloc之间的区别是新调用构造函数,返回调用变量的类型,第三个区别是我们可以逐类重载 new ,而 malloc 不能,也可以有人按班级解释这个班级。

3 个答案:

答案 0 :(得分:4)

全局命名空间中的

::operator new可以替换(覆盖),而不是重载。这会导致使用覆盖而不是标准库提供的功能。并且可以提供my_class::operator new,因此它将在new my_class表达式中使用,这也与重载不同。

重叠new仅在您使用展示位置new语法时发挥作用:

new ( memory_pool, 123, other_args ) my_class( constructor_args )

new关键字导致调用operator new的另一个重载后,在parens中提供额外的参数,并在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。)

答案 1 :(得分:2)

重载newconstructors无关。 class可以提供自己的运算符new(),它负责在构造函数调用之前分配内存。这对于优化小对象池是有用的,例如您还可以查看运算符new()的各种重载,包括所谓的“placement new”,允许为就地构造(用户提供的缓冲区),文件/行诊断,等文件提供任意参数。等

答案 2 :(得分:1)

是的,我们可以重载标准库函数malloc。 请查看下面的代码段:

    #include <iostream>
    void malloc(void)
    {
        puts("malloc");
    }

    int main()
    {
        int *p= (int*)malloc(8);
        malloc();
        free(p);
        return 0;
    }

此代码打印 malloc

此外,以下是该程序内存的TEXT部分片段:

    0000000000400744 T _Z6mallocv
    0000000000400770 T main

以下是DYNAMIC SYMBOL TABLE的片段

    0000000000000000      DF *UND*  00000000000001d2  GLIBC_2.2.5 malloc
    0000000000000000      DF *UND*  00000000000001a5  GLIBC_2.2.5 __libc_start_main

因此,我们可以重载标准库函数,如c ++中的malloc。