一.說在前面的話
1.new operator是指: new 是一個操作符
2.operator new是指: new 操作符在進行內存分配時所調用的函數,通過這個函數來最終完成內存的分配,函數operator new 通常這樣聲明:void * operator new(size_t size),注意返回的是一個void*類型,但這個函數與普通函數又有些區別,他是一個重載操作符函數,類似於 bool Carrot::operator==(const Carrot& var)這樣子.有關操作符重載點我
3.new[ ] operator 和 operator new[ ] 行為和上面一致,只不過這是為數組分配內存。
二. 摘錄
當你寫這樣的代碼:string *ps = new string("Memory Management");
你使用的new 是new operator。這個operator就象sizeof一樣是語言內置的,你不能改變它的含義,它的功能總是一樣的。它要完成的功能分成兩部分。第一部分是分配足夠的內存以便容納所需類型的對象。第二部分是它調用構造函數初始化內存中的對象。new操作符總是做這兩件事情,你不能以任何方式改變它的行為。new operator調用一個函數來完成必需的內存分配,你能夠重寫或重載這個函數來改變它的行為,new操作符為分配內存所調用函數的名字是operator new.
就象malloc一樣,operator new的職責只是分配內存。它對構造函數一無所知。operator new所了解的是內存分配。把operator new 返回的未經處理的指針傳遞給一個對象是new操作符的工作。當你的編譯器遇見這樣的語句:
string *ps = new string("Memory Management");
這句代碼或多或少與下面的代碼相似:
void *memory = operator new(sizeof(string)); // 得到未經處理的內存為String對象
call string::string("Memory Management") // 初始化 *memory內存中的對象
string *ps = static_cast<string*>(memory); // 是ps指針指向新的對象
三.演示程序:
// 自己定制 operator new 和 operator delete 函數,實現比較簡陋.
void* operator new(size_t size)
{
void* p = NULL;
p = malloc(size);
return p;
}
void operator delete(void* ptr)
{
free(ptr); // 內存釋放
}
// 自己定制 operator new[] 和 operator delete[] 函數,實現和上面是一致的
void* operator new[](size_t size)
{
void* p = NULL;
p = malloc(size);
return p;
}
void operator delete[](void* ptr)
{
// 內存釋放
free(ptr);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* buffer1 = new char[100]; // 自動調用 operator new(100),
delete[] buffer1; // 自動調用 operator delete(buffer2)
// 下面這段代碼會自動調用 operator new(sizeof(type))函數, 同時還會進入string對象的構造函數.
// 同時這也驗證了new operator的2個固定作用:自動調用operator new函數和對象的構造函數。
// delete operator 除了釋放分配的內存以為還會調用string對象的析構函數.
string* buffer2 = new string("hello world");
delete buffer2;
// 直接調用operator new函數,如果有定制則進入定制的operator new函數
void* buffer3 = operator new(10);
operator delete(buffer3);
// 題外話
// 1.下面段代碼除了分配20個字節內存外,還會進入一段匯編代碼將這段內存內容全部置為0
// 1.和memset(buffer4,0,20)同樣的作用,我個人尤其偏愛這樣寫 :)
char* buffer4 = new char[20]();
delete[] buffer4;
return 0;
}
三.總結
你想在heap(堆)上建立一個對象,應該用new operator,它既分配內存又為對象調用構造函數。如果你僅僅想分配內存,就應該調用operator new函數,它不會調用構造函數,如果你想定制自己的在heap對象被建立時的內存分配過程,你應該寫你自己的operator new函數,然後使用new操作符,new操作符會調用你定制的operator new(這句話的意思是:如果你定制了自己的operator new 函數(全局),當我們使用new operator時,系統會自動去調用你定制operator new 函數來分配內存,否則將調用默認的operator new函數),如果你想在一塊已經獲得指針的內存裡建立一個對象,應該用placement new(關於 placement new的知識請查閱原文)。