잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→

현록의 기록저장소

상속의 형태 따른 메모리 레이아웃 본문

Study/C++

상속의 형태 따른 메모리 레이아웃

현록 2019. 5. 18. 22:21

일반상속으로 깊이로 파고든 게 아닌,

다중상속으로 옆으로 나란히 생기는 레이아웃에서는,

소멸자가 필히 가상소멸자(virtual desctructor)이어야 한다.

그렇지 않으면 Invalid address specified to RtlValidateHeap 예외가 발생한다.

 

멤버 메서드는 개체 메모리 레이아웃이 아닌, 별도 메모리에 공용으로 위치한다.

static 멤버 메서드도 더더욱 마찬가지.

(멤버 메서드는 어셈블리단에서 첫 매개변수를 호출한 개체 자신으로 하여 연산하지만,

static 멤버 메서드는 클래스 공용이므로 상관않고 공용 연산을 실시한다.)

 

가상 함수가 존재하지 않으면,

가상테이블은 개체 메모리 레이아웃에 생겨나지 않는다.

가상 함수가 존재하면,

4바이트로 가장 최하위(offset=0)에 가상테이블이 위치한다.

 

가상테이블은 개체 생성시 실체에 해당하는 클래스에 따라 생성된다.

다형성으로 가리키는 레퍼런스는 상관없다.

 

다중 상속의 경우,

다중 상속 수에 따라 그 상속 시작 위치(offset)의 최하위에 가상테이블부터 생겨난다.

 

 

 

생성자 호출순서: 

소멸자 호출순서:  (생성자의 반대. 가상소멸자일 경우에 연쇄소멸 루트.)

이 구조에서는 가상소멸자가 아니더라도, 예외는 발생하지 않음.

(연쇄 소멸은 처리되지 못하고, 추가 메모리 할당이 있었다면 누수는 일어남.)

가상테이블: 1개(녹색 시작부분)

 

 

 

생성자 호출순서: 

소멸자 호출순서:  (생성자의 반대. 가상소멸자일 경우에 연쇄소멸 루트.)

가상소멸자가 아니면 예외(Invalid address specified to RtlValidateHeap) 발생.

※ 일반소멸자에서 다형성으로 표현시(정적바인딩) (ex. * object = new ();)

  delete object(*): 예외로 표시되진 않음

  delete object(*): 예외 발생

  delete object(*): 예외로 표시되진 않음

  delete object(*): 예외 발생

가상테이블: 2개(보라색 시작부분, 녹색 시작부분)

 

 

 

 

생성자 호출순서: 

소멸자 호출순서:  (생성자의 반대. 가상소멸자일 경우에 연쇄소멸 루트.)

가상소멸자가 아니면 예외(Invalid address specified to RtlValidateHeap) 발생.

※ 일반소멸자에서 다형성으로 표현시(정적바인딩) (ex. * object = new ();)

  delete object(*): 예외로 표시되진 않음

  delete object(*): 예외 발생

  delete object(*): 예외로 표시되진 않음

  delete object(*): 예외 발생

가상테이블: 3개(보라색 시작부분, 파란색 시작부분, 녹색 시작부분)

 

 

 

 

생성자 호출순서: 

소멸자 호출순서:  (생성자의 반대. 가상소멸자일 경우에 연쇄소멸 루트.)

가상소멸자가 아니면 예외(Invalid address specified to RtlValidateHeap) 발생.

가상테이블: 3개(노란색 시작부분, 파란색 시작부분, 녹색 시작부분)

 

 

C++ 클래스의 상속에 따른 메모리 구조 - 정성태

https://www.sysnet.pe.kr/2/0/11164

C++ 클래스의 상속에 따른 메모리 구조 - 정성태.pdf
0.29MB

 

 

'Study > C++' 카테고리의 다른 글

POCU 성적표  (0) 2019.07.29
연산자 오버로딩 예제  (0) 2019.05.21
Comments

잘못된 정보가 있다면, 꼭 댓글로 알려주세요(비로그인 익명도 가능).

여러분의 피드백이 저와 방문자 모두를 올바른 정보로 인도할 수 있습니다.

감사합니다. -현록

후원해주실 분은 여기로→