2013-10-11 2 views
1

샘플 코드 :왜 StackOverflowException이 호출 되었습니까? 왜 HeapOverSizedException가 발생하지 않습니까?

Static void main(string[] args) { Class1 c1 = new Class1(); } 

Class1 { Class1() { Class2 c2 = new Class2(); } } 

Class2 { Class2() { Class1 c1 = new Class1(); } } 

위의 코드는 StackOverFlowException가 발생합니다. 여기서 우리는 Class1 & Class2 개체를 반복적으로 생성합니다. 개체가 힙에 저장되고 왜 던지지 않는지 HeapOversizedException 또는 someotherException 힙에 관련이 있습니까?

+5

힙 (메모리)이 부족하지 않으므로 재귀 적으로 스택이 끊어집니다. –

+4

또한, "힙 크기 초과 예외"가 * 있습니다. ['OutOfMemoryException'] (http://msdn.microsoft.com/en-us/library/system.outofmemoryexception.aspx)라고합니다. – Jon

+0

이것은'OutOfMemoryException'으로 정의 될 것입니다. 이것은 스택의 실행 스택을 참조하는 Stack입니다. –

답변

8

무한 재귀는 항상 StackOverflowException입니다. 이것은 객체 할당 때문에가 아니라 메소드 호출이 스택에서 호출자의 주소를 기억해야하고 스택을 무의식적으로 오버플로하기 때문입니다.

Wikipedia에는 그 프로세스에 대한 공식적인 설명이 있습니다.

+1

함수를 추가 할 때마다 (그리고이 경우에는 생성자) 스택은 어디로 돌아갈 지 기억해야합니다 함수가 호출됩니다). 이 반품 정보를 저장할 수있는 장소가 제한되어 있습니다. –

3

있는 StackOverflowException - 스택 현재 주소를 저장하고 실행하는 기능 코드로 점프하는데 사용된다. 그런 다음 함수가 반환 될 때 이 튀어 나오게됩니다. 당신의 전화가 결코 끝나거나 돌아 오지 않기 때문에, 연속적으로 스택은 주소로 채워져 채워져 있습니다.

관련 문제