“新”操作符和“新”操作符之间的区别

时间:2012-08-12 07:32:17

标签: c++ operators

采访问题:“新”运营商与“新”运营商之间的区别是什么?

我回答没有区别,他们运行相同的代码,但是面试官一直在训练我,因为这是错误的答案。

这是错误的答案吗?还是面试官和我一起玩游戏?

如果这是错误的答案,那么正确的答案是什么?

我继续说,如果您需要自定义分配,“new”运算符可能会被重载,但之后他想知道 如何重载它。当然我没有那个答案,从来没有这个需要,但是我告诉他我可以在10分钟内查一查(在面试中从来没有正确答案)。

所以无论如何,在对“新”操作员与“新”功能进行了一些研究而没有看到任何真正令人满意的答案之后,我想我会问具体的问题。

5 个答案:

答案 0 :(得分:16)

new运算符和operator new不是一回事。

new运算符调用operator new函数来分配内存,然后根据分配的类型和使用的语法,初始化或调用分配的内存上的构造函数。换句话说,operator new仅构成new运算符操作的一部分。

operator new是调用new运算符分配内存的函数。有operator new的默认实现,可以替换,这与重载不同。 a particular type也可以实现operator new来处理该类型对象的分配,或者operator new可以重载,并且可以使用{{的展示位置新形式来选择重载1}} operator。

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运算符的展示位置形式一起使用,您可以添加其他参数(newoperator new的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运算符调用的构造函数),则相应的{如果在重新抛出异常之前存在{1}},则调用它。否则,在抛出异常时,不会调用operator newthe memory leaks

答案 1 :(得分:1)

基本上: - 功能:“operator new”

 class Example 
{ public:
         void* operator new( size_t );
 }

“新运营商”:

Example* eg = new Example();

答案 2 :(得分:1)

  

我继续说,如果你需要,“新”操作员可能会超载   自定义分配

你几乎是对的。 new是运算符的关键字,用于内存分配。

为什么这是一个操作员?
在需要的基础上,它可以在全局范围或类范围(但不是namespace范围内)作为两者的函数重载。如果它是一个函数,这是不可能的。

答案 3 :(得分:0)

区别在于它们的运作方式。根据我相信的标准,初始分配部分是相同的。也就是说,使用语法new vs operator new()显式是非常相同的。不同之处在于使用新的初始化或构造新对象。还有3个不同版本的:: operator new(),并且还有各种语法可以使用它们(即,放置新的)。

答案 4 :(得分:0)

没有新功能。我的猜测是他们希望你说其中一个分配内存(标准使用分配器功能功能新运算符新运算符对于它)并且另一个使用第一个来分配内存,然后调用构造函数(标准使用新表达式)和deallocator函数(又名函数删除运算符或< em> delete operator )如果构造函数以异常退出,则释放内存。