C ++에서는 실제로 힙에 메모리를 할당하지 않고 값으로 예외를 throw 할 수 있으므로이 상황이 적합합니다. 그러나 .NET 프레임 워크 OutOfMemoryException
에서는 참조 유형이므로 힙에 할당됩니다. .NET Framework OutOfMemoryException
는 메모리가 부족하여 새 개체를 만들 때 어떻게 메모리를 할당 합니까?
6
훌륭한 질문입니다. 아마도 그 상황을 위해 충분한 메모리가 예약되어있을 것입니다.
—
GreatAndPowerfulOz
이미 다른 답변에 추가하기 위해 OOM은 요청한 블록을 할당 할 수 없음을 의미합니다. 100Mb를 요청하고 런타임에서 찾을 수있는 가장 큰 사용 가능한 블록이 99Mb 인 경우 실패합니다. 그러나 OOM 예외는 몇 바이트의 메모리 만 필요합니다. 따라서 할당이 실패했다고해서 메모리가 0으로 남아있는 것은 아닙니다. 그러나 물론 런타임은이 상황에서 스스로를 커버하기 위해 약간의 메모리를 예약 할 수 있습니다.
—
Jason Williams
그런데 C ++에 대한 가정은 틀렸다. 컴파일러에 따라 예외가 힙에 할당 될 수 있습니다. MS 컴파일러는 공통 C ++ ABI에서는 그렇지 않지만 힙에 공간이 없으면 대신 사용되는 사전 할당 된 작은 비상 버퍼가 있다는 점을 제외하고 힙에 예외가 할당됩니다.
—
Sebastian Redl