new和delete的三种形式详解
2018-06-17 20:41:58来源:未知 阅读 ()
一、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。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ new初始化与定位new运算符 2020-05-22
- 定位new表达式与显式调用析构函数 2020-04-20
- C++ 中的new和delete理解与实操应用 2020-03-19
- CodeForces 1313D Happy New Year 2020-03-04
- C++的new&delete 2020-02-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash