面试问题: "新"操作员和"新"操作员之间的区别是什么?
我回答说没有区别,他们运行相同的代码,但是面试官一直在训练我,就像这是错误的答案.
这是错误的答案吗?还是面试官和我一起玩游戏?
如果这是错误的答案,那么正确的答案是什么?
我继续说,如果你需要自定义分配,"新"运算符可能会重载,但后来他想知道如何重载它.当然我没有那个答案,从来没有这个需要,但我告诉他我可以在10分钟内查一查(这在采访中从来都不是正确的答案).
无论如何,我已经对"新"操作员与"新"功能进行了一些研究而没有看到任何真正令人满意的答案,我想我会问具体的问题.
bam*_*s53 16
在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运算符的放置形式一起使用的重载,您可以添加其他参数(nothrow版本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 delete提供重载是因为如果在内存的初始化/构造期间发生错误(例如,在被调用new之后由操作符调用的构造函数operator new),operator delete则在重新抛出异常之前调用相应的对象.否则operator delete不会被调用,并且在抛出异常时内存会泄漏.
基本上:- 功能:“operator new”
 class Example 
{ public:
         void* operator new( size_t );
 }
“新运营商”:
Example* eg = new Example();