c++ - 堆栈、堆和动态内存分配
问题描述
我对这三个概念有些混淆:堆栈、堆和动态内存分配。我将提供 C++ 中的示例。
我是否正确地说,给定一个程序,对于它的所有变量、数组,也许还有堆栈上的对象,当程序刚刚启动时,所需的所有内存空间都已经存在,所以一切都是预先确定的?但是当程序运行时,对我来说,它仍然听起来像是“动态的”,因为从某种意义上说,堆栈仍然在变化,值仍然在运行时被压入、弹出堆栈。
关于堆,为了“动态”的意义,我从这个网站上的一些答案中提出了这个想法,它是在运行时确定的:
cin >> box_size; int *box = new int[box_size];
但是,那么这个†怎么样:
Box surprise_box = new Box();
我已经知道编译时需要多少空间,对吧?但它仍然在堆上。所以看起来“动态”内存分配只是关于内存分配/释放的负担成为程序员的负担之一。
†:应该Box *ptr_surprise_box = new Box();
改为。(感谢您的评论)
我理解为什么我的问题被认为过于宽泛,但我不知道如何将它们分成几部分。更糟糕的是,现在我正在考虑这是否与地址空间和编译时确定的那些内存地址有关。
解决方案
我对这三个概念有些混淆:堆栈、堆和动态内存分配。
你当然是,你混合了来自不同领域的概念——前两个与操作系统有关,最后一个与语言有关。
对于 C++,没有堆栈或堆之类的东西。C++ 中的对象有 4 种不同的存储持续时间:自动、静态、线程和动态。是的,具有自动存储持续时间的对象通常存储在堆栈中,而具有动态存储时间的对象则存储在堆中,但这是实现的细节——从语言的角度来看,没有这样的东西。有关存储期限的详细信息,请参见此处
推荐阅读
- mysql - Mysql 一对多表
- amazon-s3 - Terraform:将服务器日志记录添加到 S3 存储桶
- javascript - 多个输入文本框,链接到文件描述?
- html - 在这种情况下,如何在 html/php 中将先前的选择存储在下拉菜单中
- c# - C# 集成测试错误
- sql-server - 日志文件夹中的 SQL Server 2008 文件大小不断增加
- ansible - Ansible、vmware_guest 和挂载磁盘
- java - 如何使 Arraylist 具有相同的大小?
- html - 如何在不增加正文大小的情况下使页脚超出页面末尾
- angular - ngrx 模型严重依赖二传手