C ++에서는 실제로 힙에 메모리를 할당하지 않고 값으로 예외를 throw 할 수 있으므로이 상황이 적합합니다. 그러나 .NET 프레임 워크 OutOfMemoryException
에서는 참조 유형이므로 힙에 할당됩니다. .NET Framework OutOfMemoryException
는 메모리가 부족하여 새 개체를 만들 때 어떻게 메모리를 할당 합니까?
답변
런타임에 의해 사전 할당됩니다. 관리되는 프로세스의 힙을 탐색하면 해당 예외의 인스턴스를 찾을 수 있습니다.
Hello World 앱에서 미리 할당 된 예외는 다음과 같습니다.
0:003> !dumpheap -stat -type Exception
Statistics:
MT Count TotalSize Class Name
735f2920 1 84 System.ExecutionEngineException
735f28dc 1 84 System.StackOverflowException
735f2898 1 84 System.OutOfMemoryException
735f2744 1 84 System.Exception
735f2964 2 168 System.Threading.ThreadAbortException
답변
런타임 내에 메모리 부족 조건이 발생하면 ThrowOutOfMemory를 호출 합니다 . Exception :: GetOOMException을 호출 하여 스택에 객체를 생성 한 다음 정적으로 할당 된 전역 인스턴스에 복사 한 다음 throw합니다.
이것은 관리되는 예외는 아니지만 ex.h에 선언 된 C ++ 예외 입니다. C ++ 예외는 clrex.cpp의 관리 예외로 변환 되는데 , 여기에는 원래 appdomain.cpp에 할당되고 생성 된 사전 할당 관리 OutOfMemoryException 을 구체적으로 발생시키는 코드가 포함 되어 있습니다 .
참고 :이 소스 파일 중 일부는 커서 강조 표시를로드하는 동안 몇 초 동안 브라우저를 정지시킬 수 있습니다.
Tim Schmelter가 다른 답변에 대한 주석에서 링크 한 호출 사이트는 메모리 부족 및 개체 생성이 불가능한 런타임과 관련이 없습니다.