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函数可以重载,意味着程序员可以进行一些扩展。自定义一些内存分配机制

posted @ 2019-09-22 16:54  ChunhaoMo  阅读(439)  评论(0编辑  收藏  举报