malloc/free new/delete
메모리가 heap에 할당된다. 메모리가 Free Store에 할당된다.
결과가 타입 지정 없이 void*로 반환된다. 결과가 명확한 타입이 지정된다.
할당에 실패하면 NULL을 반환한다. 할당에 실패하면 error를 throw 한다.
메모리 할당 할 때 사이즈를 지정해 줘야 한다. 컴파일러가 메모리 크기를 계산해서 잡아준다.
더 큰 메모리로 재할당 하는 과정이 비교적 간단하다. 더 큰 메모리로 재할당 하는 과정이 비교적 귀찮다.
기본적으로 함수이다. 기본적으로 연산자이다.

 

malloc/free는 메모리를 할당하는 함수로, 할당 시 메모리가 heap 영역에 바로 할당이 된다.

또한 type과 관계 없이 반환하는 타입은 반드시 void*이며 실패 시 NULL을 반환한다.

메모리를 할당할 때에는 반드시 객체 크기를 Byte 단위로 지정을 해줘야 한다.

그리고 생성된 메모리 영역은 쓰레기값으로 차있기 때문에 초기화 과정이 따로 요구된다.

 

new/delete는 연산자이기 때문에 사용자가 overloading이 가능하다.

메모리를 할당 할 때 크기를 컴파일러가 계산해주기 때문에 따로 지정 할 필요가 없고,

연산 결과가 명확한 타입으로 반환되며 실패 시 Error를 throw 하기 때문에 에러 처리가 필요하다.

메모리를 할당할 때 free store에 할당이 되며, 할당 시 생성자를 호출하기 때문에 값이 초기화가 되어 있다.

 

new에서 생성자는 구현된 생성자에 따라 방법이 다르다.

아무것도 없다면 default 생성자를 호출한다던가, 

중괄호로 묶여 있다면 Initialize list를 호출한다던가.

 

대략적으로 짚어 보았는데 이렇게 대답을 하면 Free Store가 무엇인지 물어볼 것이다.

Free Store는 C에서의 Heap영역이라 보면 된다.

단 이는 개념적인 부분이고 실제로 메모리 영역이 나뉘어져 있는 것은 아니다.

다만 C++에서는 Heap보다는 Free Store라는 용어를 사용하는 것이 더 바람직하다는 얘기도 있다.

 

자료 출처

https://jacking75.github.io/Cpp_memory_region/

 

C++ - 메모리 영역 - jacking75

메모리 영역에 대해서 5 종류의 메모리 영역 C++ 에서는 다른 특성을 갖는 5 종류의 메모리 영역이 존재한다. (※ 단 c++ 규격에는 스택이나 힙은 명시 하지 않고 Free-Store는 명시 하고 있다) Const Data

jacking75.github.io

https://stackoverflow.com/questions/1350819/c-free-store-vs-heap

 

C++, Free-Store vs Heap

Dynamic allocations with new/delete are said to take place on the free-store,while malloc/free operations use the heap. I'd like to know if there is an actual difference, in practice. Do compilers...

stackoverflow.com

 

Virtual 키워드는 C++에서 Override 할 시 반드시 붙여줘야 하는 키워드다.

그리고 이를 붙여줘야 하는 이유를 묻는다면 입문자들은 "이걸 붙어야 Override가 되요"라고 답할 것이다.

 

여기서 C++을 좀 더 배운 사람이라면 이렇게 답할 것이다.

"C++의 virtual 키워드가 붙은 함수들은 vtable에서 함수의 주소값이 관리가 된다.

이후 하위 클래스에서 override를 하면 vtable의 주소값이 변경이 된다.

이를 통해 하위 클래스의 instance에서 override를 한 함수를 호출하면,

vtable에서 함수를 찾는 과정에서 상위 클래스의 함수가 아닌 하위 클래스의 함수를 받아오게 된다."

라고 답할 것이다.

 

하지만 virtual 키워드가 붙는 경우가 두가지가 더 있다.

하나는 생성자, 다른 하나는 소멸자이다.

그렇다면 생성자(Constructor)와 소멸자(Destructor)에서 virtual 키워드는 어떻게 동작할까?

 

이 두가지 경우, virtual 키워드가 붙어 있으면 vtable에서 상위 클래스의 생성자나 소멸자를 검색한다.

그리고 검색된 결과를 현재의 생성자/소멸자 코드 앞에 붙여준다.

이는 재귀적으로 발생하여, 최상위 클래스의 생성자/소멸자부터 순차적으로 호출이 된다.

 

이렇게 모든 생성자/소멸자들이 호출이 되면, 컴파일러는 다시 한번 코드를 자동 생성한다.

바로 멤버를 자동으로 생성/소멸하는 과정이다.

 

정리를 하자면, 

"Virtual 키워드가 붙은 함수는 물론이고 생성자, 소멸자들은 vtable에서 어떤 것을 사용 할지 관리가 된다.

이 중 함수는 Instance에 따라 하위 클래스의 함수를 호출하고, 

생성자와 소멸자는 상위 클래스의 것을 먼저 호출한 뒤 자신의 것을 호출하며,

마지막으로 멤버 생성/소멸 과정을 거친다.

때문에 Override 할 때 virtual 키워드를 사용해야 한다."

 

정도가 될 것 같다.

 

참고자료: https://stackoverflow.com/questions/7750280/how-does-virtual-destructor-work-in-c

 

How Does Virtual Destructor work in C++

I will type an example : class A { public: virtual ~A(){} }; class B: public A { public: ~B() { } }; int main(void) { A * a = new B; delete a; return 0; } Now in Above Example , destructors ...

stackoverflow.com

'메모장 > 기술면접' 카테고리의 다른 글

UE4 UPROPERTY란 무엇인가?  (0) 2020.09.01
C++ malloc/free와 new/delete의 차이점  (0) 2020.08.28
Unity Boxing과 UnBoxing  (0) 2020.08.11
UE4 Actor의 Role과 Remote Role  (0) 2020.08.10
UE4 Replicate 방식간 차이  (0) 2020.08.10

오늘은 우선 ISpawnable이란 Interface를 만들어 적용했습니다.

기존에는 IObjectActivity에 추가했는데 이렇게 되면 모든 Object나 Character들이

비슷한 기능과 이름의 함수와 공존하게 됩니다. 

그래서 새로운 Interface를 적용했습니다.

 

이를 통해 기능을 분리 했으나 여전히 Host에서 Character의 Visibility는 정상화 되지 않았습니다.

 

그 다음에는 Character의 하위 클래스를 두고, 이 하위 클래스의 생성자 내부에서 Visibility를 초기화 했습니다.

하지만 여전히 작동하지 않았습니다.

 

생각해둔 방법을 모두 사용해서 이 뒤로는 고민을 더 해야 할 것 같습니다.

일반 Object와 Character의 차이가 뭔지 좀 더 알아보려 합니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.09.02 개발일지  (0) 2020.09.02
20.08.21 개발일지  (0) 2020.08.31
20.08.24 개발일지  (0) 2020.08.24
20.08.22 개발일지  (0) 2020.08.22
20.08.20 개발일지  (0) 2020.08.20

+ Recent posts