堆栈、堆和动态内存分配

Bin*_*eee 0 c++ operating-system dynamic-memory-allocation

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

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

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

    cin >> box_size;
    int *box = new int[box_size];
    
    Run Code Online (Sandbox Code Playgroud)

    但是,那么这个怎么样:

    Box surprise_box = new Box();
    
    Run Code Online (Sandbox Code Playgroud)

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

†:应该是Box *ptr_surprise_box = new Box();。(感谢评论)


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

Sla*_*ica 6

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

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

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