堆和栈的区别(stack and heap)

来源:互联网 发布:蜀山剑侠传 知乎 编辑:程序博客网 时间:2024/06/15 23:44
栈是后进先出,堆是随便进出。
---------------------
都是一种数据结构,用于管理存储空间,  
  栈用于局部变量分配空间,   容量比较小  
  堆用于管理大块数据,   容量跟系统资源有关
----------------------
只从数据结构的方面说,栈是一种有序(filo)的结构,堆是无序结构。  
   
  而程序运行中的堆与栈是不同与上面的。汇编了解吗?比如下面的程序  
  int   max(int   a,int   b)  
  {int   x=0;       //  
  if(a>b)  
  return   a;  
  else    
  return   b;  
  }  
  调用函数时,将数据入栈;被调函数从栈中取数据,以完成计算。采用栈的结构主要是为了调用数据容易清理  
  而堆如上面老兄说得,是不定的数据使用的空间。比如一个读文件的缓冲区,开始并不知道要分配多大空间,那么栈这种固定的结构便无法满足,只好借助于堆这种结构了。
------------------------------

程序至少有三个数据区段:全局数据区,堆,栈  
  全局就是用存放C语言中的全局变量那种数据,这种变量在程序结束上会自动释放  
  堆段用来存放动态分配的变量,比如C++中用new分配的变量,这种变量必需手动释放  
  栈段一般用来存放函数中的变量  
     (函数中动态分配的变量如用new分配的变量是在堆中分配的)  
  这种变量在出栈(如函数返回)时会自动释放  
-------------------------------
1.堆是一块自由存储区要比栈大很多,在堆上分配的内存空间不能自动释放,必须手工释放  
      栈也是内存中的一块存储区,在栈上分配的空间随着变量或对象作用域的结束可以自动释放  
   
      举个例子比较好理解  
      CButton   m_button;//这种定义变量的方式就是在栈上为m_button对象分配的内存空间,随着m_button对象作用域的结束,该对象所占的内存空间可以自动释放  
   
      CButton*   pButton   =   new   CButton();  
      通过这种方式为pButton指向的CButton对象分配的内存空间就是在堆上分配的,即使该对象的作用域结束了,该存储空间也不会自动释放,必须手工使用delete   pButton来释放  
   
  2.如果想控制某个变量的生命期的话,为该变量在堆上分配存储区域,例如一个多线程的程序中  
   
      CButton   m_button;  
      AfxBeginThread(Func,&m_button);//将按钮的指针作为参数传递给线程函数  
      //线程函数  
      UINT   Func(LPVOID   lparam)  
      {  
              CButton*   pButton   =   (CButton*)lparam;  
             pButton->//这里就容易出现错误,因为线程运行到这里的时候,可能m_button所在的程序块已经结束,也就是m_button的作用域结束了,由于m_button是在栈上分配的存储空间,他的作用域结束,意味着他的存储空间也被释放掉了,而在这里还使用pButton来访问已经被释放的内存,就会出现访问非法内存的错误  
              return   0;  
      }  
   
      解决上面问题的方法可以在堆上为CButton对象分配空间,在不需要的时候再手工释放掉  
      如以上代码可以改成  
      CButton   *   pButton     =   new   CButton();//在堆上分配空间  
      AfxBeginThread(Func,pButton);  
      UINT     Func(LPVOID   lparam)  
      {  
              CButton*   p   =   (CButton*)lparam;  
              p->//这样再访问的话就不会出现错误,在使用完该指针之后可以调用delete   p;来释放堆空间  
              return   0;  
      }  
--------------------------------------------
栈是操作创建进程是为进程保留的一种内存资源,主要用于局部变量的分配,相比堆而言,栈的分配要快得多。堆是由用户进程使用malloc/free(new/delete)向系统申请得空间,需要手工释放,比较慢。像java就是完全利用堆来管理内存的,而C/C++、C#等都可以从栈的使用中得到好处!

--------------------------------------------
总结来自http://topic.csdn.net/t/20040409/14/2945507.html#
      


原创粉丝点击