2012-05-09 130 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*)

相關問題