Pra*_*mar 2 c++ malloc overloading new-operator
我经历了重载new和delete ,我在一本书上读到new和malloc之间的区别在于new调用构造函数,返回调用变量的类型,第三个区别是我们可以逐类重载new ,而malloc不能,有人可以按类基础解释这个类吗?
::operator new全局命名空间中的内容可以被替换(覆盖),不能被重载。这会导致使用覆盖而不是标准库提供的函数。并且my_class::operator new可以被提供,因此它将在new my_class表达式中使用,这也与重载不同。
new仅当您使用放置语法时,重载才会发挥作用new:
new ( memory_pool, 123, other_args ) my_class( constructor_args )
Run Code Online (Sandbox Code Playgroud)
在关键字后面的括号中提供额外的参数会导致调用new另一个重载,并在指定需要多少内存之后附加额外的参数。operator newsize_t
您当然可以::malloc像任何其他函数一样重载,通过定义采用不同参数的版本:
void *malloc( std::size_t size, allocation_pool &pool );
Run Code Online (Sandbox Code Playgroud)
这只是一个恰好被调用的新函数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.
Run Code Online (Sandbox Code Playgroud)
您还可以专门化std::allocator< my_class >及其成员函数allocate。然后,各种标准库设施将调用您的函数,尽管没有自定义new. new(由于其怪癖,您可能会避免过于深入地了解习惯。)
| 归档时间: |
|
| 查看次数: |
6541 次 |
| 最近记录: |