用堆方式创建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运算符后面跟上一对方括号即可,而无论相关数据的维数是多少


如果有说的不对的地方,希望各位博文指出互相讨论。