分配的内存在栈或堆中

Allocated memory is in the stack or heap

我声明了一个静态向量,allocating/contructing 函数中的对象(创建)。我想知道分配的内存是在堆中还是在栈中。我很困惑

// Example program
#include <iostream>
#include <vector>

using namespace std;


typedef std::vector<int> vector1Int;

static vector1Int hello;

void create(){
    hello = vector1Int(8,12);
}

int main()
{

  create();

  return 0;
}

I want to know if the memory allocated was in the heap or in the stack. Im confused

行后

hello = vector1Int(8,12);

已执行,您混合了来自几个地方的对象。

  1. hello 始终存在于程序的全局状态中。既不是堆内存也不是栈内存

  2. hello 的元素位于分配器用于为对象分配内存的内存中。在大多数情况下,默认分配器 std::allocator 使用动态分配的内存。但它也可以使用全局内存。

PS

动态分配的内存通常称为堆内存,但标准不使用该术语。

可能两者都不是。准确的术语是

  • 静态存储:针对只要进程存在就存在的数据;
  • 自动存储:对于分配的数据和fred作为进程enters/exits不同的作用域;
  • 动态存储:用于必须显式请求并存在直到显式 fred 的数据。

通常 自动内存位于堆栈中,而动态存储位于堆中。但是编译器可以完全自由地以他们想要的任何方式实现所有这些存储类型,只要它遵守生命周期规则。

所以:

static vector1Int hello;

在文件范围内并在静态存储中创建类型为 vector1Int 的对象。

还有这个

hello = vector1Int(8,12);

将导致 std::vector 为至少 8 个整数创造空间。我们通常可以假设这将从动态存储中获取。但是,这不是规则。例如,您可以通过实现自己的分配器(不是通用内存分配器,而是 STL 分配器)轻松地使 std::vector 使用静态或自动内存。

当您的程序到达 main 函数的末尾时,将为 hello 调用 std::vector 的析构函数,以及 hello 请求的任何动态内存将返回给内存管理器。

对象hello本身的内存不是fred,因为它是静态的。相反,它与进程终止时使用的任何其他东西一起返回给 OS。

现在,如果 hello 被声明为 create 的局部变量,那么析构函数将在该函数的末尾被调用。在这种情况下,hello 将在自动存储中分配,并在 create.

结束时被 fred