我对编程中的内存划分概念还不太了解。我发现在大多数.NET应用程序中,堆栈的大小通常是1MB。我的问题是:“当我在某些函数中使用本地变量为“Image”类型而其大小超过1MB时,为什么不会出现堆栈溢出?”提前致谢。
我对编程中的内存划分概念还不太了解。我发现在大多数.NET应用程序中,堆栈的大小通常是1MB。我的问题是:“当我在某些函数中使用本地变量为“Image”类型而其大小超过1MB时,为什么不会出现堆栈溢出?”提前致谢。
public static void DoSomethingToImage()
{
Image img = new Image(...);
}
img
变量中。只有值类型的本地变量才会被分配在栈上。对于像Image
这样的引用类型,只有引用被分配在栈上,对象被分配在堆上。
您的本地变量实际上是引用(“指针”)。这些图像并不存储在堆栈中 ;)
static int x = 0;
static void Main()
{
fn();
}
static void fn()
{
Console.WriteLine(x++);
fn();
}
这是由于代码出了问题,因为通常在数千次调用后才会发生这种情况。
上述应用程序以此方式退出:
...
15706
15707
15708
Process is terminated due to StackOverflowException.
static void fn2() { long x0 = 0 , x1 = 0 , .... , x100100 = 0 , x100101 = 0 ; }
会产生错误:app1.cs(18,840840): error CS0204: Only 65534 locals are allowed
,而这个:static void fn2() { long x0 = 0 , x1 = 0 , .... , x65528 = 0 , x65529 = 0 ; }
和这个:static void fn2() { long x0 = 0 , x1 = 0 , .... , x65528 = 0 , x65529 = 0 ; Console.WriteLine(x++); fn2(); }
永远不会溢出。...我认为C#有内部检查来防止堆栈溢出。 - sharp12345
StackOverflow
异常与内存中的对象无关。您可以从MSDN文档中清楚地看到这一点。但是,如果OP在谈论内存管理,那就是一个不同的世界。请查看我的更新。 - Mike PerrenoudStackOverflowException
异常。理论上,您可能只有一个或两个方法调用包含 1MB 的堆栈空间,但实际上这几乎是不可能的;唯一的方法是通过大量嵌套的方法调用来实现。OP 没有意识到的是,他分配的大对象并没有放在堆栈上,堆栈只是指向堆上的对象(或在此情况下是大对象堆)的指针。 - Servy