C++은 프로그래머가 직접 new
, delete
로 할당과 해지를 해주어야했다.
이걸 잘못 관리하면 아래와 같은 문제점이 나타나게 된다.
Memory Leak
: 메모리가 해지되지 않아서 힙에 메모리가 그대로 남음Dangling Pointer
: 이미 해제된 메모리의 주소를 가르키는 포인터Wild Pointer
: 값이 초기화 되지 않아서 엉뚱한 주소를 가르키는 포인터이런 실수를 줄이기 위해 많은 프로그래밍 언어들이 가비지 컬렉터를 사용한다.
언리얼 엔진도 이런 가비지 컬렉션 시스템을 사용하고, 그 중 마크-스윕
방식을 사용한다.
프로그램에서 더 이상 사용하지 않는 오브젝트를 자동으로 감지해 메모리를 회수하는 시스템이다.
이런 가비지 컬렉션을 백그라운드에서 계속 돌리는 것이 생각보다 비용이 꽤 든다.
이것을 조정할 수 있도록 프로젝트 설정에서 다양한 값을 변경할 수 있다.
언리얼에는 관리되는 모든 언리얼 오브젝트의 정보를 저장하는 전역 변수 GUObjectArray
가 존재한다.
이 변수의 각 요소에는 Flag
가 설정되어 있다.
주요 Flag로는 아래와 같은 친구들이 있다.
가비지 컬렉터는 여기의 플래그를 주기적으로 확인해서 메모리를 회수해간다.
언리얼 오브젝트를 메모리에서 삭제하려면 C++마냥 delete
를 사용해서 하는 것이 아니라 레퍼런스를 없앰으로써 가비지 컬렉터가 자동으로 메모리를 회수할 수 있도록 하는 것이 좋다.
언리얼 오브젝트를 사용한다면 위에서 알아봤던 포인터를 사용함에 있어 나오는 문제점을 해결 할 수 있다.
Memory Leak
: 가비지 컬렉션을 사용하여 해결Dangling Pointer
: IsValid()
등의 함수를 사용하여 해결Wild Pointer
: UPROPERTY
매크로를 사용하면 자동으로 초기화nullptr
은 아닌데 IsValid
에서는 유효하지 않다고 나온다.