new
运营商和operator new
不是一回事。
new
运算符调用operator new
函数来分配内存,然后根据分配的类型和使用的语法在分配的内存上初始化或调用构造函数。换句话说,operator new
仅构成new
运算符的一部分操作。
operator new
是调用new
运算符调用内存的函数。有一个默认实现operator new
可以是替换,这与重载不一样。 operator new
也可以用于a particular type来处理仅分配该类型的对象,或者operator new
可能会过载,并且可以通过使用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
的缺省实现可以通过定义函数具有以下签名来代替要提供operator new
的过载以用于new
运算符的位置表单,您可以添加额外的参数(operator new
和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 new
后由new
操作者称为构造被调用)的过程中发生错误,如果它存在重新引发异常之前的相应operator delete
被称为的operator delete
过载是因为提供。否则,在引发异常时不会调用operator delete
,并调用the memory leaks。
什么是新功能?我从来没有听说过标准C++中的这种函数(请注意,我不是C++的人)。 – 2012-08-12 07:35:43
您引用与*运算符* new相同的新*函数吗?这通常就是所谓的,它应该可以帮助你找到答案。 – 2012-08-12 07:41:31
可能问题在于新运营商和运营商之间的差异。 http://stackoverflow.com/questions/1885849/difference-between-new-operator-and-operator-new。 – Heisenbug 2012-08-12 07:55:30