new和delete的三种形式详解
一、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。
上一篇: python 实现插入排序算法
下一篇: 自动红眼移除算法 附c++完整代码