2012-05-09 31 views
0

我知道newdelete是关键字。什么是“:: operator new”和“:: operator delete”?

int obj = new int; 
delete obj; 

int* arr = new int[1024]; 
delete[] arr; 

<new>头是C++标准报头的一部分。它有两个运营商(我不知道他们是经营者或他们的功能):

::operator new

::operator delete

这些运营商使用方法如下:

#include <new> 
using namespace std; 

int* buff = (int*)::operator new(1024 * sizeof(int)); 
::operator delete(buff); 

什么是“:: operator new“和”:: operator delete“?它们与newdelete关键字不同吗?

回答

2

::告诉编译器调用全局命名空间中定义的运营商。
它是全球newdelete运营商的全名。

注意,人们可以replace the global new and delete operators as well as overload class-specific new and delete operators。所以在程序中可以有两个版本的newdelete运营商。使用范围解析运算符的完全限定名称告诉编译器您指的是运算符的全局版本,而不是特定于类的。

+0

但程序员应该包括'new'头。 –

+1

@AmirSaniyan如果您希望使用[放置新],请添加新标题(我知道)的唯一原因(http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.10 ) – Benj

+0

@AmirSaniyan:好读作:[当是在#包括C++需要库?](http://stackoverflow.com/questions/2788388/when-is-include-new-library-required-in-c) –

2

::意味着只是一个全局命名空间

+0

当'new'是一个关键字时,我为什么要使用全局命名空间? –

+1

你不应该表明你正在使用来自全局命名空间的新命令。但是你可以覆盖你的新版本,如果你需要 –

2

他们分配器和释放器功能。该new符不 两件事情:它会调用分配函数来获得内存,并 调用该对象的构造函数。该delete运营商也做 两件事情:它会调用析构函数,然后调用一个释放器 功能。默认的分配器功能是::operator new,并且 默认的释放器功能是::operator delete。两者都可以由用户替换 。

。注意,在一个新的表达式中,::operator new功能看着 向上或多或少相同的方式,因为这将是如果它是从一个成员函数中称为正常 功能。至于正常功能, 您可以限定运营商更改查找:new MyClass将 找到一个成员operator new如果有一个; ::new MyClass将使用 默认的分配,即使MyClass定义成员operator new

+0

+1来区分分配函数和* new-expression *,你将使用你的命名空间。两者都在其语法中使用'new'关键字。 –

4

new关键字(单独使用)与operator new函数不一样。

调用

Object* p = new Object(value); 

等同放着清单呼吁

void* v = operaor new(sizeof(Object)); 
p = reinterpret_cast<Object*>(v); 
p->Object::Object(value); //this is not legal C++, it just represent the implementation effect 

运营商新的(或更好的void* operator new(size_t)变体)刚刚分配内存,但没有做任何对象的构造。

new关键字调用operator new函数,但随后调用对象的构造函数。

要敷设渠道的独立分配,运营商新的变体被声明为

void* operator new(size_t, void* at) 
{ return at; } 

和以前的代码通常写为

Object* p = reinterpret_cast<Object*>(operator new(sizeof(Object))); //no contruction here 
new(p) Object(value); //calls operator new(size_t, void*) via keyword 

operator new(size_t, void*)什么也不做的本身,而是,被被关键字调用将导致构造器被调用。

相反地,破坏和释放可与

p->~Object(); 
operator delete(p); //no destructor called 

代替delete p分开;调用析构函数,然后operator delete(void*)

相关问题