用堆方式创建int对象,并释放p
程序如下:
#include <iostream.h> void main() { int *p; p = new int; *p = 5; cout << *p << endl; delete p; cout << *p <<endl; }
程序运行结果:
5
-572662307
注解:
1、p=new int; 申请了int型的空间给p看着,p记住首地址。
2、delete p; 把p和这块内存的关系切了,p不再指向int,但p还存在,指向一个随机值。此句即清内存的操作。这时p成为了野指针。
(举例:int a; a是局部变量,此时为a申请int型的空间,加电即有值(二进制),栈开内存不初始化,记住位置)
(野指针是指指向不可用内存的 指针。任何指针变量在被创建时,不会自动成为NULL指针(空指针),其默认值是随机的,所以指针变量在创建的同时应当被初始化,或者将指针设置为NULL,或者让它指向合法的内存,而不应该放之不理,否则就会成为野指针)
程序中第一次定义p指针,为它申请了int型的空间,没有放置不理,还给p指向的地址赋值为5,所以第一次输出为5。
3、new和delete要对应,new了记得使用delete清内存,否则会造成内存泄露。
扩展:
1、空指针可以写为p=0或者p=NULL,一般写后者,以免与数字0混淆。C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。
2、通用指针可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void指针。
程序代码如下:
#include<stdio.h> int main() { int n=3,*p; void *gp; gp=&n; p=(int*)gp; printf("%d\n",*p); return 0; }
程序输出结果:
3
/*
题外话:
char 有2^8=256种可能或状态,并不表示最多存储256个字符。看怎么定义。可以1000(1)、2000(2)、3000(3)、……XX(256)。
*/
短短的几句程序,却汇集了如此多的知识点。无论从语法,深刻点讲,从运行机制,涉及到内存处理分配等,都有很多地方值得细细品味。
总结:
l 动态内存分配new
int * pi;
pi= newint ;
l 为数组动态分配内存
int*pi;
pi=newint[8];
l 为多维数组分配内存
int (* pi)[3];
pi=newint[44][3];
l 释放内存delete
delete [] pi; //释放内存空间时,我们只需要在delete运算符后面跟上一对方括号即可,而无论相关数据的维数是多少
如果有说的不对的地方,希望各位博文指出互相讨论。