首页 > 解决方案 > 堆栈、堆和动态内存分配

问题描述

我对这三个概念有些混淆:堆栈、堆和动态内存分配。我将提供 C++ 中的示例。

  1. 我是否正确地说,给定一个程序,对于它的所有变量、数组,也许还有堆栈上的对象,当程序刚刚启动时,所需的所有内存空间都已经存在,所以一切都是预先确定的?但是当程序运行时,对我来说,它仍然听起来像是“动态的”,因为从某种意义上说,堆栈仍然在变化,值仍然在运行时被压入、弹出堆栈。

  2. 关于堆,为了“动态”的意义,我从这个网站上的一些答案中提出了这个想法,它是在运行时确定的:

    cin >> box_size;
    int *box = new int[box_size];
    

    但是,那么这个†怎么样:

    Box surprise_box = new Box();
    

    我已经知道编译时需要多少空间,对吧?但它仍然在堆上。所以看起来“动态”内存分配只是关于内存分配/释放的负担成为程序员的负担之一。

†:应该Box *ptr_surprise_box = new Box();改为。(感谢您的评论)


我理解为什么我的问题被认为过于宽泛,但我不知道如何将它们分成几部分。更糟糕的是,现在我正在考虑这是否与地址空间和编译时确定的那些内存地址有关。

标签: c++operating-systemdynamic-memory-allocation

解决方案


我对这三个概念有些混淆:堆栈、堆和动态内存分配。

你当然是,你混合了来自不同领域的概念——前两个与操作系统有关,最后一个与语言有关。

对于 C++,没有堆栈或堆之类的东西。C++ 中的对象有 4 种不同的存储持续时间:自动、静态、线程和动态。是的,具有自动存储持续时间的对象通常存储在堆栈中,而具有动态存储时间的对象则存储在堆中,但这是实现的细节——从语言的角度来看,没有这样的东西。有关存储期限的详细信息,请参见此处


推荐阅读