c++中的new 和delete

  new是用来动态申请内存空间的C++中的一个关键字。delete是用来删除new所申请空间对象的。

  想深入理解new请看:http://blog.csdn.net/songthin/article/details/1703966

  

  delete p和delete [] p的区别:

    1、int* p = new int(20);

         delete p;

    2、int*p = new int[10]();//数组带初始化

        delete [] p;

  从上面两个小例子,可以看出delete p 用来删除单个元素,而delete [] p用来删除数组元素。注意:当删除数组元素时如果使用delete [] p 编译也会是正确的,但意思就不同了。

 

关于delete后的野指针:

    如上1,2所示,当删除指针后,该指针变成悬垂指针(dangling pointer).悬垂指针指向曾经存放对象的内存,但该对象已经不存在了。  悬垂指针往往导致程序错我,而且一般很难检测出来。所以一旦删除了对象就立即将指针设置为0,例如 delete p; p = NULL;

   下面是一个关于悬垂指针的列子:引用原文http://blog.sina.com.cn/s/blog_6405313801013jvg.html  

#include <iostream>
using namespace std;

int main()

{

int *p = new int;

*p = 3;

cout<<"将3赋给p的地址后,指针p读取的值:"<<*p<<endl;

delete p;

cout<<"删除空间后,指针p读取的值:"<<*p<<endl;

long *p1 = new long;

*p1 = 100;

cout<<"p1的值:"<<*p1<<endl;

cout<<"p的值:"<<*p<<endl;

cout<<"创建新空间后,指针p中保存的地址:"<<p<<endl;

cout<<"指向新空间的指针p1保存的地址:"<<p1<<endl;

*p = 23;

cout<<"将23赋给p的地址后,指针p读取的值;"<<*p<<endl;

cout<<"将23赋给p的地址后,指针p1读取的值:"<<*p1<<endl;

delete p1;

return 0;

}  

  

 

运行结果:

 以上代码可以看出,删除后的指针p和新建的指针p1指向的是同一块内存,出现这种状况的原因其实是由于编译器。编译器默认将释放掉的内存空间回收然后分配给新开辟的空间。

 欢迎赐教!

posted @ 2015-06-22 09:36  尼牟  阅读(263)  评论(0编辑  收藏  举报