程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> more effective c++筆記2-----Item M8:理 解各種不同含義的new和delete

more effective c++筆記2-----Item M8:理 解各種不同含義的new和delete

編輯:C++入門知識

一.說在前面的話

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的知識請查閱原文)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved