Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我们可以重载malloc()吗?_C++_Malloc_Overloading_New Operator - Fatal编程技术网

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

C++ 我们可以重载malloc()吗?,c++,malloc,overloading,new-operator,C++,Malloc,Overloading,New Operator,我经历了重载new和delete,我在一本书中读到new和malloc的区别是new调用构造函数,返回调用变量的类型,第三个区别是我们可以逐个类重载new,而malloc不能,有人能解释一下这个类的基础吗。重载new与构造函数无关。类可以提供自己的操作符new(),该操作符负责在构造函数调用之前分配内存。这对于优化小对象池非常有用,例如,您还可以查看操作符new()的各种重载,包括所谓的“placement new”,允许为就地构造(用户提供的缓冲区)、文件/行诊断、,等等。:全局命名空间中的运

我经历了重载new和delete,我在一本书中读到new和malloc的区别是new调用构造函数,返回调用变量的类型,第三个区别是我们可以逐个类重载new,而malloc不能,有人能解释一下这个类的基础吗。

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

:全局命名空间中的运算符new
可以替换(重写),而不是重载。这会导致使用覆盖而不是标准库提供的函数。并且可以提供
my_class::operator new
,以便在
new my_class
表达式中使用它,这也不同于重载


重载
new
仅在使用placement
new
语法时起作用:

new ( memory_pool, 123, other_args ) my_class( constructor_args )
new
关键字后面的parens中提供额外参数会导致调用另一个重载的
运算符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.
模板
void*my_allocate(std::size_t sz);//也许“sz”参数是不必要的。

您还可以专门化
std::allocator
及其成员函数
allocate
。然后,各种标准库设施将调用您的函数,尽管没有自定义
new
。(由于自定义
new
的特殊性,您可以避免深入了解它。)

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

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

    int main()
    {
        int *p= (int*)malloc(8);
        malloc();
        free(p);
        return 0;
    }
下面是来自动态符号表的代码段

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

因此,我们可以在C++中加载标准的库函数,如MALLC。

<代码>,我们可以按类按基重载< < /代码>——这意味着可以为每种类型自定义构造函数。OK,MalOC??我们可以用Maloc做同样的操作,我是指将MulLoCo()重载为函数,因为我不明白为什么书上写的是我们不能?所以我们不需要让malloc超负荷,所以我们不去做,或者这样做可能会有某种语言错误。例如,如果我想分配所需的地址,或者可能是分配的返回地址或大小OK,那么我猜答案是,对于new的情况,因为重载可能在我们知道要分配的大小等情况下有用,因为它也将创建对象。但是在malloc中,我们不能有类似的优势,因为malloc仅限于分配内存,所以我们不需要重载malloc,这样做没有必要,也没有好处。@Praveen-没错,malloc是“无类型的”,只返回一个空*,所以实际上没有重载的依据。
    0000000000000000      DF *UND*  00000000000001d2  GLIBC_2.2.5 malloc
    0000000000000000      DF *UND*  00000000000001a5  GLIBC_2.2.5 __libc_start_main