我经历了重载 new 和 delete,我在一本书中读到 new 和 malloc 是 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/