我经历了重载新和删除,我在一本书中读到了 new 和 malloc之间的区别是新调用构造函数,返回调用变量的类型,第三个区别是我们可以逐类重载 new ,而 malloc 不能,也可以有人按班级解释这个班级。
答案 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)
重载new
与constructors
无关。 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。