C#应用程序中的堆栈溢出

时间:2012-12-27 13:11:31

标签: c# memory stack-overflow

我对编程中的内存划分概念不熟悉。我发现堆栈的大小在大多数情况下是在.NET应用程序1MB轮。我的问题是:“如果在某些函数中我使用局部变量为大于1MB的”Image“类型,堆栈溢出怎么不出现。提前感谢。

5 个答案:

答案 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.

您可以学习在调试器中看到“调用堆栈”窗口,它将显示函数调用列表。