我对编程中的内存划分概念不熟悉。我发现堆栈的大小在大多数情况下是在.NET应用程序1MB轮。我的问题是:“如果在某些函数中我使用局部变量为大于1MB的”Image“类型,堆栈溢出怎么不出现。提前感谢。
答案 0 :(得分:7)
因为StackOverflow
异常与堆栈或堆内存管理无关。根据{{3}}:
执行堆栈溢出时抛出的异常,因为它包含太多嵌套方法调用。这个类不能被继承。
现在,如果你在谈论关于记忆的stack
,那么我们处在一个不同的世界。您存储在内存中的图像可能会保存在MSDN Documentation上。内存管理及其对话对于本论坛而言过于宽泛 - 但如果您对内存管理有特定问题,那么我们可以解决这个问题。
重要的是要了解您在问题中混合了两个命名法和概念,并且两者之间存在明显差异。我不希望你继续认为你应该因为大对象而得到StackOverflow
异常。我还不希望你继续认为 因为大对象和内存管理而获得StackOverflow
异常。
答案 1 :(得分:6)
图像本身不存储在堆栈中,它存储在堆上。只有一个指向图像的指针/引用保留在堆栈上,这个指针要小得多。
public static void DoSomethingToImage()
{
Image img = new Image(...);
}
在上面的代码片段中,Image在堆上分配,对映像的引用存储在堆栈上的img
变量中。
答案 2 :(得分:4)
只有值类型的局部变量才会在堆栈上分配。对于像Image
这样的引用类型,只在堆栈上分配引用,该对象在堆上分配。
答案 3 :(得分:2)
您的局部变量实际上是引用(“指针”)。那些图像不存储在堆栈中;)
答案 4 :(得分:1)
发生堆栈溢出错误的主要原因是有大量的函数调用,通过此错误的示例将是这样的:
static int x = 0;
static void Main()
{
fn();
}
static void fn()
{
Console.WriteLine(x++);
fn();
}
这是由于代码出错而导致的,因为这通常发生在数千次调用之后。
上面的申请就像这样退出:
...
15706
15707
15708
Process is terminated due to StackOverflowException.
您可以学习在调试器中看到“调用堆栈”窗口,它将显示函数调用列表。