NEWind(深入理解new和delete的原理)
导读:new ,delete 运算符 int *p =...
new ,delete 运算符
int *p =new int; delete p; 看一下汇编代码可以看到new 和delete 运算符其实也是 operator运算符重载函数的调用
malloc和new
malloc 按字节开辟内存 new在开辟内存的时候需要指定类型 new int[10]
malloc 返回的是 void * 而 operator new 会帮助 转为 int *
malloc只负责开辟空间, new 不仅仅有malloc的功能,可以进行数据的初始化 new int(20) new int100;
malloc 开辟失败返回nullptr指针, new 开辟失败 是抛出 bad_alloc的异常 try{ int *p=new int; delete p; }catch(const bad_alloc & err){ cerr<<err.what()<<endl; }free和 delete
delete:调用析构函数 再 free() new -> operator new delete ->operator delete //先调用operator new 开辟内存空间,然后调用对象的构造函数(初始化) void * operator new(int size){ void *p=malloc(size); if(p==nullptr){ throw bad_alloc(); } return p; } //delete p :调用p指向的对象的析构函数,再调用operator delete 释放内存空间 void operator delete(void * p){ free(p); } //针对数组用得new void * operator new[](int size){ void *p=malloc(size); if(p==nullptr){ throw bad_alloc(); } return p; } //针对数组用得delete void operator delete[](void * p){ free(p); } new 和 delete ; new[] delete[] 能混用吗? class student{ public: student(int age):page(new int(age)){ } ~student(){ delete page; } private: int * page; } sutdent *ps=new student(20); delete ps;//student 会被析构 delete [] ps;//执行报错 sutdent *ps2=new student[20]; delete []ps2; //20个student 会被析构 delete ps2;//执行报错创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!