"new"运算符和"new"函数的区别

Difference between "new" operator and "new" function

本文关键字:new 区别 运算符 函数      更新时间:2023-10-16

面试问题:"新"运算符和"新"函数有什么区别?

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

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

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

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

所以无论如何,在对"新"

运算符与"新"函数进行了一些研究之后,没有看到任何真正令人满意的答案,我想我会问一个具体的问题。

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

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

operator newnew 运算符为分配内存而调用的函数。有一个可以替换的默认实现operator new,这与重载不同。 还可以为特定类型实现operator new以仅处理该类型的对象的分配,或者可以使用 new 运算符的放置新形式重载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以与new运算符的放置形式一起使用,您可以添加其他参数(operator 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运算符在调用operator new后调用的构造函数),则在重新抛出异常之前调用相应的operator delete(如果存在)。否则,不会调用operator delete,并且在引发异常时内存泄漏。

基本上:-功能:"操作员新"

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

"新操作员":

Example* eg = new Example();

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

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

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

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

没有新功能。我的猜测是,他们希望您说其中一个分配了内存(标准使用分配函数,函数新运算符和新运算符),另一个使用第一个来分配内存,然后称为构造函数(标准使用新表达式)和 deallocator 函数(又名函数删除运算符或删除 运算符)以释放内存如果构造函数退出异常。