代码之家  ›  专栏  ›  技术社区  ›  cesarknbv

已分配内存在堆栈或堆中

  •  1
  • cesarknbv  · 技术社区  · 7 年前

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

    // 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;
    }
    
    2 回复  |  直到 4 年前
        1
  •  4
  •   R Sahu    7 年前

    我想知道分配的内存是在堆中还是在堆栈中。我很困惑

    在生产线之后

    hello = vector1Int(8,12);
    

    执行时,您可以混合来自多个位置的对象。

    1. hello 始终处于计划的全局状态。它既不是堆内存,也不是堆栈内存。

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

    附言

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

        2
  •  1
  •   giusti    7 年前

    可能两者都没有。确切的术语是

    • 静态存储:对于只要进程存在就存在的数据;
    • 自动存储:用于在流程进入/退出不同范围时分配和fred的数据;
    • 动态存储:用于必须显式请求且在显式fred之前存在的数据。

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

    因此:

    static vector1Int hello;
    

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

    还有这个

    hello = vector1Int(8,12);
    

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

    当您的程序到达 main 函数的析构函数 标准::矢量 将被要求 hello ,以及任何动态内存 你好 had请求将返回给内存管理器。

    对象的内存 你好 它本身不是fred,因为它是静态的。相反,当进程终止时,它将与进程使用的任何其他内容一起返回给操作系统。

    现在,如果 你好 已声明为的局部变量 create ,则会在该函数结束时调用析构函数。那样的话 你好 将在自动存储中分配,并将在 创造 .