new运算符可以自动计算所申请空间的大小,而malloc()函数则必须由程序员指出所需申请分配空间的大小。
#include<iostream> using namespace std; int main() { char *p1; int *p2; int *p3=new int (14); int *p4=new int [3]; p1=new char; //new一个整型数,并将该整型数的地址赋值给p1 p2=new int (10);//new一个初值为200的整型数,并将该整型数的地址赋给p2 *p1=97; for(int i=0;i<3;i++) { cin>>*(p4+i); } cout<<*p1<<endl; cout<<*p2<<endl; cout<<*p3<<endl; for(int i=0;i<3;i++) { cout<<*(p4+i)<<" "; } cout<<endl; delete p3; delete p2; delete p1; delete []p4; p1=NULL; p2=NULL; p3=NULL; p4=NULL; system("pause"); return 0; }
2.delete只能用来释放用new申请分配的动态内存空间;反之,new申请的动态内存空间必须用delete来释放。
delete与new必须有对应的关系。
3.delete执行之后,指针所指向的内存空间就被释放了,而指向该动态内存区域的指针变量本身并不会因为delete有任何改变。
4.delete之后,不对指针变量做任何处理,就会造成“指针悬挂”;
5.指针变量声明后没有进行初始化就通过它操作内存空间,则可能制造一个“野指针”;
6.关于指针和动态内存要特别注意:
指针消亡了,并不代表它所指向的动态内存会被自动释放,自动消亡;
动态内存被释放了,并不代表指向该动态内存的指针变量会消亡或自动变成NULL;
做到以下几点:
1.定义指针变量的同时初始化。如不初始化就一定要将其设置成NULL,避免该指针指向一个不确定的地方,引发误操作,这是非常危险的。
一旦把它置成NULL,误用它就不会造成太大问题;
2.delete指针以后,第一时间将其设置为NULL。即使是一个马上就要消亡的局部指针变量,也可立即将其置成NULL。养成良好的习惯是避免错误的有效方法;
3.当指针指向数组时,一定谨慎防止指针越界操作;
4.避免用指针传递桟内存,避免返回一个即将自动消亡的局部变量或局部对象的地址。
桟内存中的局部变量和局部对象都不能跨函数生存,要注意它们的生存周期。
原文地址:http://blog.csdn.net/lanzhihui_10086/article/details/39736969