new/delete和new[]/delete[]的底层调用和简单实现
在使用new的时候做了两件事:
1、调用operator new分配空间
2、调用构造函数初始化对象
在使用delete的时候也做了两件事:
1、调用析构函数清理对象
2、调用operator delete函数释放空间
在使用new[N]的时候也做了两件事:
1、调用operator new分配空间
2、调用N次构造函数初始化N个对象
在使用delete[]的时候也做了两件事:
1、调用N次析构函数清理N个对象
2、调用operator delete函数释放空间
定位new表达式:定位new表达式是在以分配的原始空间中调用构造函数初始化一个对象。
new(place_address) type;
new(place_address) type(initializer-list);
place_address必须是一个指针,initializer-list是初始化列表
利用mallco/free和定位new表达式来模拟new/delete和new[]/delete[]:
例:
classA{public:A(inta=2):_a(a){cout<<"A()"<<endl;}voidShow(){cout<<_a<<endl;}~A(){cout<<"~A()"<<endl;}private:int_a;};voidtest(){//分配1个A类型空间A*pa=(A*)malloc(sizeof(A));new(pa)A(1);//调用构造函数pa->~A();//调用析构函数free(pa);//分配10个A类型的空间A*pa=(A*)malloc(sizeof(A)*10);for(inti=0;i<10;i++)//调用十次构造函数{new(pa+i)A(i);}for(inti=0;i<10;i++)//调用十次析构函数{(pa+i)->~A();}free(pa);}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。