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指向的是同一块内存,出现这种状况的原因其实是由于编译器。编译器默认将释放掉的内存空间回收然后分配给新开辟的空间。
欢迎赐教!