"new"操作符和"new"函数之间的区别

9

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

我回答说它们没有区别,因为它们运行相同的代码,但是面试官一直像针扎一样问我,好像那不是正确答案。

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

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

我接着说,“new”操作符可以被重载,如果你需要自定义分配,但是他想知道如何重载它。当然我没有那个答案,因为我从来没有这个需求,但我告诉他我可以在10分钟内查找(这在面试中从来都不是正确答案)。

所以,经过对“new”操作符与“new”函数进行了一些研究,没有看到任何真正令人满意的答案,我想问一个具体的问题。


3
新功能是什么?我从未在标准C++中听说过这样的功能(请注意,我不是C++专业人员)。 - user529758
你所提到的新的function是指operator new吗?通常它被称为这个名字,这应该有助于你在谷歌上寻找答案。 - Cody Gray
3
也许问题是关于new operator和operator new之间的区别。https://dev59.com/enI-5IYBdhLWcg3wYnOQ 。 - Heisenbug
1
@Heisenbug 同意。那个问题中包含了一个非常清晰的定义。 - Independent
5个回答

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;

要为new运算符的放置形式提供operator new的重载,您可以添加附加参数(operator newoperator delete的nothrow版本会这样做)。

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

不存在“placement delete”形式的delete运算符。提供了operator delete的重载,因为如果在内存的初始化/构造期间发生错误(例如,在operator new调用后由new运算符调用的构造函数中),则在重新抛出异常之前,会调用相应的operator delete(如果存在)。否则,在抛出异常时operator delete不会被调用,从而导致内存泄漏


1
基本上:- 功能:“operator new”
 class Example 
{ public:
         void* operator new( size_t );
 }

"

新运算符:

"
Example* eg = new Example();

1
你说得几乎正确。 new是一个用于内存分配的运算符关键字。
为什么它是一个运算符? 根据需要,它可以在全局范围或类范围(但不是命名空间范围!)中作为函数进行重载。如果它是一个函数,这是不可能的。

0

它们的区别在于它们的功能。我相信,最初的分配部分是标准的,也就是说,使用语法new和operator new()显式地非常相似。不同之处在于,使用new初始化或构造新对象。还有三个不同版本的::operator new(),以及各种语法来利用它们(例如,放置new)。


0

没有新的函数。我的猜测是他们希望你说其中一个分配了内存(标准使用分配器函数new运算符函数new运算符),而另一个则使用第一个来分配内存,然后调用构造函数(标准使用new表达式)和释放内存的函数(也称为删除运算符函数删除运算符),以便在构造函数因异常而退出时释放内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接