new
运算符和不是operator new
一回事。
new
运算符调用一个operator new
函数来分配内存,然后根据分配的类型和使用的语法,在分配的内存上初始化或调用构造函数。换言之,operator new
仅构成操作员操作的一部分new
。
operator new
是new
操作员为分配内存而调用的函数。有一个operator new
可以替换的默认实现,这与重载不同。operator new
也可以为特定类型实现以仅处理该类型对象的分配,或者operator new
可以重载并且可以通过使用new
操作符的放置新形式来选择重载。
的默认实现operator new
可以通过定义具有以下签名的函数来替换:
void *operator new(std::size_t size);
void *operator new(std::size_t size, const std::nothrow_t&);
void *operator new[](std::size_t size);
void *operator new[](std::size_t size, const std::nothrow_t&);
当您为您提供替换或重载时,operator new
您应该提供相应的operator delete
功能:
void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
要提供与运算符operator new
的放置形式一起使用的重载,new
您可以添加其他参数(operator new
and的 nothrow 版本operator delete
)。
struct my_type {};
void *operator new(std::size_t size, const my_type&);
void operator delete(void *ptr, const my_type&);
new (my_type()) int(10); // allocate an int using the operator new that takes a my_type object
运算符没有“放置删除”形式delete
。提供的重载operator delete
是因为如果在内存的初始化/构造过程中发生错误(例如,在调用new
运算符之后调用的构造函数),则在重新抛出异常之前调用operator new
相应的如果它存在。operator delete
否则operator delete
不调用,并且在抛出异常时内存泄漏。