现在的位置: 首页 > 综合 > 正文

C++ 堆的理解

2013年08月26日 ⁄ 综合 ⁄ 共 1554字 ⁄ 字号 评论关闭

堆的理解:

      堆是一大堆不连续的内存区域,在系统中由列表将他们串接起来,为了数据隐蔽,堆中的每个单元内存都是匿名的,因此你必须先在堆中申请一个内存单元地址,然后把他保存在一个指针中,这样你只有使用指针才可以访问到该内存单元的内容.

堆的好处:

      1:可以存储比较大的数据

      2:程序员自己控制创建和释放

      3:只有特定的指针才能访问特定的数据,这样就避免了任何试图修改他的操作

做法:

      首先创建一个堆,然后定义一个指向该堆的指针,这样就只能通过该指针才能访问堆中的数据  C++中使用关键字new创建一个堆并分配一个内存,在new  后面跟一个要分配的对象类型,便宜器根据这个类型来确定分配内存的大小

      int *p;//定义了一个指向整型的指针变量p

      p=new int;//new来在堆中创建一个int类型的内存区域,然后将该区域的内存指针赋值给指针变量 p,这样的话p所指向的就是这块新建立的内存区域  

      new int //创建成功了返回一个地址 把这个地址赋给p

     也可以合并为一句话int *p=new int;

     这样的话定义指针p的同时初始化了他的值为一个在堆中新建的int型的存储区的内存地址

我们可以像使用普通指针一样使用他 并且把值赋给他所指向的内存空间

     *p=1;

 

注意由于内存很有限 所以可能会出现没有足够内存而无法满足new请求的情况,在这种情况下,new会返回0,该值被赋值给指针后该指针就是一个空指针,空指针不会指向有效数据.

 

注意指针的内存泄露:

内存泄露:由于使用new创建的内存空间不会被系统自动释放,因此假如你不去释放他那么该区域的内存将始终不能为其他数据所使用,而指向该内存的指针是个局部变量,当定义该指针的函数结束并返回的时候,指针也就消失了,那么我们就再也找不到该块内存区域了,这种情况我们叫内存泄露,因此 假如你不需要一块内存空间 那么就必须对指向他的指针使用关键字delete

int *p=new int; delete p;这样的话将释放指针所指向的内存,而不会释放指针,因此你还可以使用这个指针而先前指针指向的堆中的内存已经释放了

注意 如果指针指向了堆中对象的话只能释放一次 不能重复释放,要释放指针的话将p=0;这样的话 释放一个空指针是可以的

程序如下:

int *p=new int;//向系统申请一块int类型的堆中的内存把返回的地址赋给int 类型的指针p

delete p;//删除了指针p所指向的那块内存 但是指针还保留着

p=new int;//再申请一块堆中内存把返回的地址赋值给指针p

delete p;//再删除指针所指向的那块内存

p=0;//设置指针为空指针

delete p;//删除指针 如果没有上面的设置为空指针 那么俩个delete p是错误的

return 0;

 

/***************************/

内存泄露的小代码:

   int *p=new int;

   p=new int;

 

正确的做法:

 in*p=new int;

 delete p;

 p=new int;

或者

in*p1=new int;

in*p2=new int;

/***************************/

//堆代码解释

Human *p;//定义了一个Human类的指针

p=new Human;//创建了一块内存区域,同时调用Human类的默认构造方法来构造一个对象,它所占用的内存大小根据Human对象的成员变量来决定,假如该类有俩个int类型的成员变量.那么该对象占用2*4=8个字节,本行的右半部分创建一个对象完毕后,跟着将该内存地址赋值给左边的指针变量p.

上面俩行可以合并 Human *p=new Human;

delete p;//调用对象的析构函数 并释放内存

 

抱歉!评论已关闭.