new与delete
- 申请内存
-
回顾malloc/free
注意:malloc申请而来的只是内存,严格地说不是"对象"// 4个int, 16个字节 int* p = (int*) malloc(16); for(int i=0; i<4; i++) { p[i] = i; } free(p);
- 创建对象
- 在C++中,用new/delete操作符取代malloc/free
// 申请一个对象:
int* p = new int;
// 释放
delete p;
-
注意:
- new的返回值直接就是对象指针,不用再转换
- new的时候可以设初始值 new int(12)
-
申请多个对象
// 申请1024个对象 int* p = new int [1024]; for(int i =0; i<1024; i++) { p[i] = i+1; } // 释放 delete [] p;
-
注意:
- 用[]指定对象个数
- 如果new的时候用了[],则释放的时候使用delete []操作符
// 申请一个Student对象 Student* s = new Student; s->id = 12; strcpy(s->name, "shaofa"); // 用完之后,释放 delete s; // 申请500个Student Student* st = new Student[500]; for(int i =0; i<500; i++) { s[i].id = i+1; }
- 使用原则
- 使用原则与malloc/free类似,都是向内存管理器MM来s申请内存。
- 用new申请的内存,必须用delete释放
- 用new []申请的内存,必须用delete []释放
- 用完之时,及时释放!
- 注意事项
- 和free一样,delete之后指针所指向的内存不再可用
delete p;
p = NULL; // 最好置为空指针
- 注意:释放之后,指针的值不发生改变
- 动态创建对象
-
对于class类型,必须用new/delete来创建、销毁。
malloc/free是无法胜任的
-
new动态创建了一个对象
- 申请一块内存
- 内部调用了构造函数
-
delete:释放这个对对象
- 调用了析构函数
- 释放内存
-
动态创建一个对象
// 默认构造函数 Circle* c = new Circle(); // 不加括号也可以 Circle* c = new Circle(); // 传构造参数 Circle* c = new Circle(1, 1, 4); // 释放对象 delete c;
-
注意:new的时候构造函数被调用,delete的时候析构函数被调用
-
动态创建多个对象
Circle* c = new Circle[4]; delete [] c;
-
注意:含有“默认构造函数”的类,才可能使用new []一次性地创建多个对象
-
new与malloc的巨大区别:
malloc返回的只是一片内存,不是对象(malloc不负责构 造)
new返回的是一个可以正常工作的对象(因为它调用了析构函数)
所以,new/delete绝不仅仅是申请内存这么简单,它是申请了内存,并且构造了对象
// 虽然可以用malloc的方法强制转换成对象,但是由于没有调用默认构造函数,成员变量x,y的参数值都是乱的 Circle* p =(Circle*)malloc(sizeof(Circle));
-
小结:
- new得到的是一个对象,malloc得到的不是对象。因此,C++的类必须用new,不能用,malloc
- new一个对象的时候,可以传参,内部会调用构造函数
- new多个对象(数组)的时候,不能传参数,要求该类必须有默认构造函数