堆和堆栈有什么不同啊?程序什么时候用堆什么时候用堆栈?

fvv 2004-04-01 10:20:49
1 堆和堆栈有什么不同啊?
2 程序什么时候用堆什么时候用堆栈?
3 为什么把内存叫做堆和堆栈?
...全文
450 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
fvv 2004-04-01
  • 打赏
  • 举报
回复
很少提问,对你们的热情深深感动.下次提问的时候,肯定出200分.
fvv 2004-04-01
  • 打赏
  • 举报
回复
to mscf(扎西特勒) 不错的文章thanks
fvv 2004-04-01
  • 打赏
  • 举报
回复
了解.看的出是刚写完的
vcforever 2004-04-01
  • 打赏
  • 举报
回复
不是,不是,我可没那么牛,我说我的回复是刚写完的!:)
薛定谔之死猫 2004-04-01
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dngenlib/html/msdn_heapmm.asp
w3guy 2004-04-01
  • 打赏
  • 举报
回复
to: showjancn(难得一剑)(CN)
>> 从汇编的角度来说,栈相当于通用寄存器,运行速度特别快,但数量很有限。而堆就相当于RAM.容量较大的多。

不要误导别人哦,栈指针是放在寄存器里,栈本身是放在内存里的。
fvv 2004-04-01
  • 打赏
  • 举报
回复

vcforever(霓裳羽衣) 你是说<VC编程思想> 你刚写完? 会放出来吗?
fvv 2004-04-01
  • 打赏
  • 举报
回复
超感谢 vcforever(霓裳羽衣)
薛定谔之死猫 2004-04-01
  • 打赏
  • 举报
回复
Memory Management: Heap AllocationSee Also
Memory Management (MFC)
The heap is reserved for the memory allocation needs of the program. It is an area apart from the program code and the stack. Typical C programs use the functions malloc and free to allocate and deallocate heap memory. The Debug version of MFC provides modified versions of the C++ built-in operators new and delete to allocate and deallocate objects in heap memory.

When you use new and delete instead of malloc and free, you are able to take advantage of the class library's memory-management debugging enhancements, which can be useful in detecting memory leaks. When you build your program with the Release version of MFC, the standard versions of the new and delete operators provide an efficient way to allocate and deallocate memory (the Release version of MFC does not provide modified versions of these operators).

Note that the total size of objects allocated on the heap is limited only by your system's available virtual memory.
vcforever 2004-04-01
  • 打赏
  • 举报
回复
这个不是贴上来的,是我刚写完的!呵呵
fvv 2004-04-01
  • 打赏
  • 举报
回复
<<VC编程思想>>有着本书吗?没有见过.
薛定谔之死猫 2004-04-01
  • 打赏
  • 举报
回复
手头没有,许多书都提到
vcforever 2004-04-01
  • 打赏
  • 举报
回复
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;
}

2.他们两个的资源释放方式不同,当燃要分开来叫了
堆就是堆
堆栈一般来说是指栈

写了这么多,希望对你有所帮助!
fvv 2004-04-01
  • 打赏
  • 举报
回复
概念是这样.但是太笼统,谁有深入点的文章贴一篇上来.就给分.
薛定谔之死猫 2004-04-01
  • 打赏
  • 举报
回复
楼上说得好
showjancn 2004-04-01
  • 打赏
  • 举报
回复
堆和栈都是作为内存中的一部分。
主要分别是栈上内存是由程序自己管理的,用户不能申请,且效率相当高,但数量很有限。而堆中的内存可有用户自己管理。
从汇编的角度来说,栈相当于通用寄存器,运行速度特别快,但数量很有限。而堆就相当于RAM.容量较大的多。当然还得说明一点是,由于程序在调用时会自对压栈,退出是会自动弹栈,因此在栈上申请的空间会自动释放(比如局部变量等)。而堆上的则由用户自己管理。
名牌大灰狼 2004-04-01
  • 打赏
  • 举报
回复
上面说的不错我同意.但对编程没有什么用.你还是去看看VC编程思想.要比你明天这个好的多.
薛定谔之死猫 2004-04-01
  • 打赏
  • 举报
回复
1 堆和堆栈有什么不同啊?
是操作系统提供内存给应用程序的两种不同的内存分配方式。
2 程序什么时候用堆什么时候用堆栈?
堆上的内存需要应用程序自己申请,用完了自己释放,否则出现泄漏,栈上的内存通过堆栈指针访问,释放是廉价的。
3 为什么把内存叫做堆和堆栈?
是应用程序拥有的不同的内存资源。
小李匪盗 2004-04-01
  • 打赏
  • 举报
回复
gz
zswzwy 2004-04-01
  • 打赏
  • 举报
回复
强烈建意去看一下《windows核心编程》,看完了,你就能更深入的了解WINDOWS内存的工作方式了。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧