我声明一个静态向量,并在一个函数(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>();
}
答案 0 :(得分:4)
我想知道分配的内存是在堆中还是在堆栈中。我很困惑
行后
hello = vector1Int(8,12);
被执行,你有来自几个地方的混合物。
hello
始终生活在该计划的全球状态中。它既不是堆内存也不是堆栈内存。
hello
的元素存在于内存中,分配器使用它来为对象分配内存。在大多数情况下,默认分配器std::allocator
使用动态分配的内存。但它也可以使用全局记忆。
<强> PS 强>
动态分配的内存通常称为堆内存,但标准不使用该术语。
答案 1 :(得分:1)
可能都不是。确切的术语是
通常自动内存存在于堆栈中,动态存储位于堆中。但是编译器可以完全自由地以他们想要的任何方式实现所有这些存储类型,只要它遵守生命周期规则。
所以:
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>