差异

2012-08-12 85 views
9

面试问题:什么是“新”的经营者和“新”功能的区别?差异

我回答没有区别,它们运行相同的代码,但面试官不停地刺我这样是错误的答案。

难道错误的答案?还是面试官只是跟我玩游戏?

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

我继续说,如果你需要一个自定义分配,“新”操作符可能会超载,但他想知道如何重载它。当然,我没有这个答案,从来没有这样的需要,但我告诉他我可以在10分钟内看到它(这是从来没有在采访中的正确答案)。

所以无论如何,已经做了“新”运算符与“新”的功能,并没有看到任何真正令人满意的答案了一些研究,我认为我会问的具体问题。

+3

什么是新功能?我从来没有听说过标准C++中的这种函数(请注意,我不是C++的人)。 – 2012-08-12 07:35:43

+0

您引用与*运算符* new相同的新*函数吗?这通常就是所谓的,它应该可以帮助你找到答案。 – 2012-08-12 07:41:31

+3

可能问题在于新运营商和运营商之间的差异。 http://stackoverflow.com/questions/1885849/difference-between-new-operator-and-operator-new。 – Heisenbug 2012-08-12 07:55:30

回答

1

基本上是: - 功能: “运营商新的”

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

“新的运营商”:

Example* eg = new Example(); 
1

我继续说, “新的” 运营商可能过载,如果你需要 自定义配置

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

为什么这是运营商?
根据需要,它可以作为函数在全局范围或类作用域(但不是namespace作用域!)都被重载为。如果它是一个功能,这将不可能实现。

0

区别在于它们的功能。我认为,按照标准,初始分配部分是相同的。也就是说,明确使用语法new vs operator new()是非常相似的。区别在于,使用新的初始化或构造新的对象。还有3个不同版本的:: operator new(),并且还有各种语法来使用它们(即,放置新的)。

0

没有新的功能。我的猜测是,他们希望你说,其中一个分配内存(标准使用分配器功能,功能新运营商新运营商它),而另一个使用第一个分配内存,然后叫的构造(该标准使用新表达)和释放器功能(又名函数删除操作者删除操作者)释放内存如果构造与异常退出。

16

new运营商和operator new不是一回事。

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

operator new是调用new运算符调用内存的函数。有一个默认实现operator new可以是替换,这与重载不一样。 operator new也可以用于a particular type来处理仅分配该类型的对象,或者operator new可能会过载,并且可以通过使用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的缺省实现可以通过定义函数具有以下签名来代替要提供operator new的过载以用于new运算符的位置表单,您可以添加额外的参数(operator newoperator 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 new后由new操作者称为构造被调用)的过程中发生错误,如果它存在重新引发异常之前的相应operator delete被称为的operator delete过载是因为提供。否则,在引发异常时不会调用operator delete,并调用the memory leaks