Search
Duplicate
🥕

exception은 스택과 힙 어디에 할당될까

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C++
Scrap
태그
9 more properties

개요

std::exception은 스택과 힙 어디에서 할당될까

분석

throw를 작성하고 어셈을 확인하자.
1.
__cxa_allocate_exception() 을 호출하여 할당한다
2.
std::exception 생성자를 호출한다
3.
exception의 타입에 대한 정보를 매개변수 레지스터에 담는다
4.
__cxa_throw를 호출하여 throw 루틴을 수행한다
떡하니 __cxa_allocate_exception()으로 할당한다고 한다. 컴파일러 내부 함수인듯 하니 찾아가자.
귀찮으니 구글에 대충 치면 나온다
__cxa_allocate_exception 함수 내용을 확인하자. 내부에서 __aligned_malloc_with_fallback()을 호출한다. 즉 힙에서 malloc하는 거다.
malloc/free 맞음

exception 메모리 해제 시점

그러면 free는 언제 될까?
catch 하면서 하겠지… catch를 추가. 어셈을 확인하자
.L5 가 catch절인데 보면 __cxa_begin_catch() 와 __cxa_end_catch() 가 있다. 이것도 컴파일러 내부 함수인 듯 하니 찾아보자.
__cxa_begin_catch()부터 보자. 별 내용은 없는 듯 하다. 보니까 global 변수로 예외를 관리하는 듯
해제는 __cxa_end_catch()에서 할테니 __cxa_end_catch()를 보자. 보면 catch에서 rethrow 되었을 경우에는 삭제하지 않고, rethrow되지 않았으면 refCount를 줄인 뒤 0이되면 지워버린단다.
RC 부분을 찾아보면 atomic으로 카운트하고 destructor 호출 후 __cxa_free_exception() 한다.
__aligned_free_with_fallback()을 최종적으로 확인