参考文献
参考文献
C++中,用new和delete动态创建和释放数组或单个对象。
new:
动态创建对象时,只需指定其数据类型,而不必为该对象命名,new表达式返回指向该新创建对象的指针,我们可以通过指针来访问此对象。
int *pi=new int;
delete:
释放指针指向的地址空间。
delete pi ;// 释放单个对象
delete [ ]pi;//释放数组
如果指针指向的不是new分配的内存地址,则使用delete是不合法的。
引起问题:
悬空指针:
delete pi; //执行完该语句后,p变成了不确定的指针,在很多机器上,尽管p值没有明确定义,但仍然存放了它之前所指对象的地址,然后p所指向的内存已经被释放了,所以p不再有效。此时,该指针变成了悬垂指针(悬垂指针指向曾经存放对象的内存,但该对象已经不存在了)。悬垂指针往往导致程序错误,而且很难检测出来。
一旦删除了指针所指的对象,立即将指针置为0,这样就非常清楚的指明指针不再指向任何对象。(零值指针:int *ip=0;)
零值指针和NULL指针
零值指针,是值是0的指针,可以是任何一种指针类型
空指针,只是一种编程概念,就如一个容器可能有空和非空两种基本状态,而在非空时可能里面存储了一个数值是0,因此空指针是人为认为的指针不提供任何地址讯息。
相同点:
(1)都是申请内存,释放内存,free和delete可以释放NULL指针;
(2)都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄露。
new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete、malloc/free必须配对使用。
不同点:
new/delete :运算符,可自动执行构造和结构函数,自动计算需要分配的空间,类型安全(自动报错)
malloc/free:库函数,不可自动执行构造和结构函数,需要手工计算字节数,类型不安全(不会自动报错)
由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。
11-01
472
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
02-22
324
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
12-29
955
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)