栈是后进先出,堆是随便进出。
---------------------
都是一种数据结构,用于管理存储空间,
栈用于局部变量分配空间, 容量比较小
堆用于管理大块数据, 容量跟系统资源有关
----------------------
只从数据结构的方面说,栈是一种有序(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#
---------------------
都是一种数据结构,用于管理存储空间,
栈用于局部变量分配空间, 容量比较小
堆用于管理大块数据, 容量跟系统资源有关
----------------------
只从数据结构的方面说,栈是一种有序(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#