c++中的new和delete
我们知道指针常和堆空间的分配有关。其实堆就是一块内存区域,它允许程序运行时通过指针的方式
从其中申请一定数量的存储单元。
堆内存有程序员管理。
上一篇讲了c的malloc和free,我们知道free是为了释放内存,否则造成内存泄漏(自己不用,其他程序也用不了,占着茅坑不拉屎的那种^_^)
malloc使用需要计算需要的内存大小,还必须类型转换 (int *)malloc(sizeof(int)
而new就不需那么麻烦
int *p1 = new int;就完事了
delete和free是差不多相同的
下面看个例子吧
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int *p1,*p2,*p3; 7 p1 = new int;//动态分配一个能存储int的内存区域 8 p2 = new int(10);//分配一个int大小的内存区域,并把10存入其中,可以初始化值 9 p3 = new int[10];//分配能够存放10 int 的数组内存区域 10 11 //判断内存分配是否成功 12 if(!p3) 13 { 14 puts("allocation failure"); 15 return 1; 16 } 17 18 *p1 = 5; 19 *p3 = 1; 20 21 p3[1] = 2; 22 p3[2] = 3; 23 24 cout << "address of p1 = " << p1 <<" "<< "value of p1 = " << *p1 << endl; 25 cout << "address of p2 = " << p2 <<" "<< "value of p2 = " << *p2 << endl; 26 //基地址就是p3[0]地址 27 cout << "address of p3[0] = " << p3 <<" "<< "value of p3[0] = " << *p3 << endl; 28 cout << "address of p3[1] = " << &p3[1] <<" "<< "value of p3[1] = " << p3[1] << endl; 29 30 //内存释放 31 delete p1,p2; 32 //delete p3;不可行,因为这个地方只释放了第一地址 33 delete []p3; 34 return 0; 35 }
那么new和delete 相对于malloc 和 free有什么优势呢?
1.new不需要用sizeof计算要分配的内存字节数,减少出错概率
2.new不用进行类型转换,就能自动返回正确的指针类型
3.new还可以初始化,比如上面代码的 p2 = new int(10)进行初始化
4.new 和 delete函数可以重载,意味着程序员可以进行一些扩展。自定义一些内存分配机制