new和delete的三種形式詳解
阿新 • • 發佈:2018-05-08
分別是 額外 ID 調用 pre else class code alloc
一、new操作符、delete操作符
class String { public: String(const char *str="") { if(str== NULL) { data=new char[1]; data=‘\0‘; } else { data=new char[strlen(strlen(str)+1]; strcpy(data,str); }~String() { delete[] data; data=NULL; } private: char *data; };
在上面的String類中,當你去定義一個String對象時,用new去創建對象時,用delete去析構該對象時,此時new
和delete有兩個操作,分別是當用new創建對象時,第一步是先去開辟內存空間,第二步則是使用構造函數去構造對
象。同樣當用delete去析構對象時也同樣有兩個操作,第一步是去調用析構函數去析構對象,第二步則是釋放其內存
空間。在使用new創建對象時和用delete析構對象時,它們的順序是相反的。
二、操作符new、操作符delete
void* operator new(size_t sz) { void *p= malloc(sz); return p; } void operator delete(void *p) { free(p); } void* operator new[](size_t sz) { void *p= malloc(sz); return p; } void operator delete[](void *p) { free(p); }
當你去創建一個對象時,new操作符則會包含兩步操作,第一步先去調用上面的重載操作符new的函數,先去開辟
內存空間,第二步去調用類的構造函數去構造對象。當去析構一個對象時,delete操作符也同樣包含兩步操作,第
一步先去調用類的析構函數去析構對象,第二步調用上面的重載操作符delete的函數,將內存空間釋放。同樣的,這
是用new創建單個對象的函數,當你需要動態開辟數組空間時,下面兩個函數則是開辟數組空間的函數和釋放數組內
存空間的函數。需要特別註意的是,void* operator new(size_t sz);函數的參數類型必須是size_t類型即無符號整
數類型,且函數的返回值必須是void*類型,否則編譯不通過,下面的開辟數組空間的函數也是一樣的。
三、定位new
void* operator new(size_t sz) { void *p= malloc(sz); return p; } void operator delete(void *p) { free(p); } void* operator new[](size_t sz) { void *p= malloc(sz); return p; } void operator delete[](void *p) { free(p); } class String { public: String(const char *str="") { if(str== NULL) { data=new char[1]; data=‘\0‘; } else { data=new char[strlen(strlen(str)+1]; strcpy(data,str); } ~String() { delete[] data; data=NULL; } private: char *data; }; void* operator new(size_t sz,int *d,int pos) { return &d[pos]; } int main() { String *ps= (String*)operator new(sizeof(String)); new(ps)String("Hello"); ps->~String(); operator delete(ps); //new(p)類型(初始值) int ar[10]; new(ar,3)int(10); new(ar,5)int(99); new(ar,9)int(9); return 0; }
定位new即運算符new進行重載,在重載的函數中需要去使用一個額外的指針去指向所開辟的數組空間,pos即
數組中的下標位置,即將所需要的數據插入到指定的pos位置,這就是定位new。
new和delete的三種形式詳解