9

面试题: “new”操作符和“new”函数有什么区别?

我回答没有区别,他们运行相同的代码,但面试官一直在针我,好像那是错误的答案。

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

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

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

所以无论如何,在对“新”运算符与“新”函数进行了一些研究之后,并没有看到任何真正令人满意的答案,我想我会问具体的问题。

4

5 回答 5

16

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

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

operator newnew操作员为分配内存而调用的函数。有一个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 newand的 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不调用,并且在抛出异常时内存泄漏。

于 2012-08-12T08:49:44.393 回答
1

基本上:- 功能:“操作员新”

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

“新运营商”:

Example* eg = new Example();
于 2012-08-12T07:35:22.913 回答
1

我继续说,如果您需要自定义分配,“新”运算符可能会被重载

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

为什么这是一个运算符?
根据需要,它可以在全局范围或类范围(但不是范围!)中作为函数重载namespace。如果它是一个函数,这是不可能的。

于 2012-08-12T07:47:53.880 回答
0

不同之处在于它们的功能。根据我认为的标准,初始分配部分是相同的。也就是说,显式使用语法 new 与 operator new() 非常相似。不同之处在于使用 new 初始化或构造新对象。::operator new() 也有 3 个不同版本,并且有多种语法可以使用它们(即,placement new)。

于 2012-08-12T07:48:14.843 回答
0

没有新功能。我的猜测是他们想让你说其中一个分配了内存(标准使用分配器函数函数 new 运算符new 运算符),另一个使用第一个分配内存,然后调用构造函数(标准如果构造函数因异常退出,则使用新表达式)和释放器函数(又名函数删除运算符删除运算符)来释放内存。

于 2012-08-12T07:52:23.360 回答