分配的内存位于堆栈或堆中

时间:2018-02-16 17:29:44

标签: c++ memory vector stack heap

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

using (var nodeReader = new XmlNodeReader(xmldoc))
{
    nodeReader.MoveToContent();
    XDocument xdoc = XDocument.Load(nodeReader);
    List<dynamic> elements =
    (
        from item in xdoc.Descendants("s")
        select new
        {
            Begin = (item.FirstNode as XElement).LastAttribute.Value,
            Last = (item.LastNode as XElement).LastAttribute.Value,
            NodeValuesInArray = item.Descendants("w").Select(q => q.Value).ToArray(),
            NodeValuesCommaSeparated = string.Join(" ", item.Descendants("w").Select(q => q.Value).ToArray())
        }
    ).ToList<dynamic>();
}

2 个答案:

答案 0 :(得分:4)

  

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

行后

hello = vector1Int(8,12);

被执行,你有来自几个地方的混合物。

  1. hello始终生活在该计划的全球状态中。它既不是堆内存也不是堆栈内存。

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

  3. <强> PS

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

答案 1 :(得分:1)

可能都不是。确切的术语是

  • 静态存储:只要进程存在就存在的数据;
  • 自动存储:用于进程进入/退出不同范围时分配和fred的数据;
  • 动态存储:用于必须明确请求且存在的数据,直到明确更改为止。

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

所以:

static vector1Int hello;

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

这个

hello = vector1Int(8,12);

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

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

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

现在,如果hello被声明为create的局部变量,那么析构函数将在该函数的末尾被调用。在这种情况下,hello将在自动存储中分配,并且会在create结束时进行。{/ p>