new总结
new与malloc
开辟一个空间:
//c malloc与free c++ new与delete
int *p = (int*)malloc(sizeof(int));
free(op);
op = NULL;
int *s = new int(10);
delete s;
s = NULL;
开辟多个空间:
int main()
{
int n = 10;
int *p = (int *)malloc(sizeof(int)*n);
int *s = new int[n](10); //vs 2019 ; c99可直接初始化
free(p); p = NULL;
delete []s; //注意格式的书写
return 0;
}
- malloc、new、free、delete功能
malloc :开辟空间,不创建对象
new:具有两个功能,(1) 堆区开辟空间 (2)调动构造函数,在空间中创建对象,并将10赋值(初始化)
free:释放空间
delete:具有两个功能,(1)调动析构函数,将对象的资源释放,(2)释放空间 - new(delete)与malloc(free)区别
(1) malloc是函数,new不但是关键字,更是运算符,new可以重载,而malloc不能重载;
(2) new不需要计算类型的大小,系统会自动进行计算,而malloc需要计算类型的大小,使用sizeof(类型);
(3) 返回类型:malloc是无类型指针,需要强转,而new没有返回类型;
(4) malloc只是开辟空间,而new在申请空间(不是创建空间,空间是由系统分配)之后,调动构造函数,创建对象;
(5) 当malloc申请空间失败后,返回空指针,而new申请空间失败后,抛出异常:throw bad_alloc;
(6) malloc释放空间,使用的是free,而new释放空间所使用的是delete,不能混乱使用;
(7) free的功能只是释放空间,而delete的功能有两个,首先调动析构函数,将对象的资源释放之后,再释放空间
(8) 对于开辟n个空间:
malloc只是申请n个空间,并没有进行初始化,而new在申请多个空间的同时,创建多个对象并进行初始化
在释放n个空间时,delete释放一组对象,格式:delete []s;
new的三种调动形式
new共有三种调动形式:
- 运算符调动(关键字调动)
- 函数调动
- 定位new
class Object
{
private:
int value;
public:
Object(int x=0):value(x)
{
cout<<"creat object"<<this<<endl;
}
~Object()
{
cout<<"destroy object"<<this<<endl;
}
};
int main()
{
Object *op = new Object(10);//运算符调动 2个功能
delete op; //运算符释放 2个功能
Object *os = (Object*)::operator new(sizeof(Object));//函数调动 1个功能
::operator delete(os); //函数释放 1个功能
new(os) Object(100);//定位new 1个功能
os->~Object(); //调动析构函数
return 0;
}
总结:
- 运算符调动:new具有两个功能(如上),用delete释放空间(功能如上);
- 函数调动:只是申请空间,功能和malloc相同,只有一处不同:malloc申请空间失败,返回空指针,而函数调动,抛出异常,throw bad_alloc。
并且使用::operator delete(os)释放空间,不会调用析构函数; - 定位new:不开辟空间,只是将Object所创建的对象放在os指向的空间,可以调用析构函数释放对象所占用的资源。