采访问题:“新”运营商与“新”运营商之间的区别是什么?
我回答没有区别,他们运行相同的代码,但是面试官一直在训练我,因为这是错误的答案。
这是错误的答案吗?还是面试官和我一起玩游戏?
如果这是错误的答案,那么正确的答案是什么?
我继续说,如果您需要自定义分配,“new”运算符可能会被重载,但之后他想知道 如何重载它。当然我没有那个答案,从来没有这个需要,但是我告诉他我可以在10分钟内查一查(在面试中从来没有正确答案)。
所以无论如何,在对“新”操作员与“新”功能进行了一些研究而没有看到任何真正令人满意的答案之后,我想我会问具体的问题。
答案 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
运算符的展示位置形式一起使用,您可以添加其他参数(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
运算符调用的构造函数),则相应的{如果在重新抛出异常之前存在{1}},则调用它。否则,在抛出异常时,不会调用operator new
和the 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 )如果构造函数以异常退出,则释放内存。