文章目录
为什么需要new和delete?
分析如下代码:
void main()
{
A*p=NULL;//声明A类类型的指针变量p,占用4字节大小
p=(A*)malloc(sizeof(A));//为P开辟空间
p_>print();//是个随机值
free(p);
}
malloc()为指针开辟空间,但是malloc只是开辟了空间,但未给其合法值,没有调用构造函数,此时如果p->print(),用p去调用输出函数,结果会是随机值,相对于free(p),只是释放一块空间,但并没有析构对象。基于这种现象,C++中引入new和delete
使用方法
- new
- 为参数开辟空间:
- new A; //不带参数
- new A(6); //带参数赋初始值6
- 为指针开辟空间
开辟了一个字节的空间
char * p=new char; //new了一个字符型的空间
开辟一个数组的空间
char * p =new char[20]; //new了20个字符型连续的内存空间,让p指向该空间
strcpy(p,"abcdefg"); //就可以进行赋值等字符串操作....
- delete
- delete []p;//释放一个数组,中括号写在delete和数组名p之间,强调删除的是数组
- delete和new开辟的空间相对应,new一个数组就要delete一个数组
new一个基本数据类型,只用delete一次即可,一次性释放
- A *p=new char[20];
- delete p;
new一个对象数组,则释放时不能一起释放,构造几个析构几个。
- A *p=new A[20];
- delete []p; //delete p[];不对
与malloc和free的区别:
new和delete是运算符
malloc和realloc和free是库函数
new和delete可以调用构造和析构函数,malloc和free只能开辟和释放空间
new不需要强制类型转化,malloc开辟的空间需要强转