응애맘마조
동적할당 및 해제/댕글링 포인터/가비지 컬렉션/스마트 포인터/메모리 단편화/메모리 풀 본문
주의 : 해당 게시물에서 작성될 내용은 과제를 해결하기 위해 출처의 내용을 그대로 작성한 부분이 많으며 일절 광고나 수익 창출 목적으로 쓰인 것이 아님을 밝힙니다.
동적할당 및 해제에 대해서는 https://keisukeaso.tistory.com/121 게시글을 참고해 주시면 됩니다.
댕글링 포인터는 허상 포인터라고도 하며 유효한 적절한 객체를 가리키고 있지 않은 포인터입니다. 이미 할당이 해제된 메모리를 가리키는 포인터가 댕글링 포인터라고 할 수 있습니다. 따라서 댕글링 포인터가 존재하면 전체적인 프로그래밍 진행에 문제가 될 수 있고 이러한 문제를 해결하기 위해서는 해제가 되었다면 NULL 값으로 초기화해 주는 거나 위에 적은 동적할당으로 해서 매개변수로 받거나 매크로를 사용하는 것이 좋습니다.
매크로에 관해서는 https://keisukeaso.tistory.com/128 게시글을 참고해 주시면 됩니다.
C++은 메모리를 수동으로 할당하고 해제를 해야 되는 언어입니다. 메모리 관리를 못하거나 실수를 하게 되면 프로그램이 갑자기 중단될 수 있습니다. 이러한 문제를 해결하는 기술이 가비지 컬렉션(Garbage Collection)입니다. 더 이상 사용하지 않는 메모리를 자동으로 해제하는 프로세스로서 프로그래머가 직접 할당 및 해제에 대한 문제를 덜 수 있습니다. 하지만 C++은 가비지 컬렉션을 내장하지 않기 때문에 라이브러리에서 기능을 제공하는 것이 있는데 Boehm-Demers-Weiser입니다.
다음 스마트 포인터(Smart Pointer)는 말 그대로 똑똑한 포인터라고 할 수 있습니다. 일반적으로 사용하던 포인터는 직접 하는 일이 없지만 스마트 포인터는 직접 하는 일이 있습니다. 스마트 포인터는 객체로 분류됩니다. 포인터의 역할을 하는 객체로 볼 수 있습니다. 앞서 말했듯이 동적으로 할당받은 메모리는 반드시 delete를 사용해서 해제를 해야 됩니다. 하지만 스마트 포인터는 가비지 컬렉션처럼 메모리 관리를 하지만 사용 방법은 조금 다릅니다. 동적할당으로 기본 포인터가 실제 메모리를 가리키도록 초기화하고 기본 포인터를 스마트 포인터에 대입을 합니다. 그렇게 정의된 스마트 포인터의 역할이 끝나게 되면 소멸자가 delete를 사용해서 메모리를 자동으로 해제합니다. 반환하는 주소값을 스마트 포인터에 대입하면 소멸자에서 따로 delete를 사용하지 않아도 됩니다. 종류로는 unique_ptr, shared_ptr, weak_ptr이 있고 memory 헤더 파일에 정의되어 있습니다.
메모리 단편화(Memory Fragmentation)는 RAM에서 메모리의 공간이 작은 공간으로 여러 개로 나뉘어 충분히 사용 가능하지만 할당이 불가능한 상태를 말합니다. 메모리 단편화는 내부 단편화와 외부 단편화로 구분할 수 있습니다.
내부 단편화(Internal Fragmentation)는 메모리 할당 시 프로세스 실행 시 필요한 메모리보다 더 큰 메모리가 할당되어서 메모리 공간이 낭비되었을 때를 말합니다.
외부 단편화(External Fragmentation)는 메모리가 할당되고 해제되는 작업이 반복되면서 작은 메모리들이 중간에 존재하게 되는데 이 사이에 비어있는 메모리가 많아서 총 메모리 공간은 충분한데 실제로는 할당할 수 없을 때를 말합니다.
이렇게 메모리가 파편화되었을 때 해결 방법은 페이징 기법, 세그멘테이션 기법, 메모리 풀 기법이 있지만 여기서는 메모리 풀 기법에 대해서만 설명하겠습니다.
메모리 풀(Memory Pool)은 필요한 메모리 공간을 크기, 개수만큼 사용자가 직접 지정하여 미리 할당받아놓고 필요할 때마다 사용하고 반납하는 기법입니다. 이 기법 없이 동적할당과 해제를 반복하게 되면 메모리의 랜덤 한 위치에 할당과 해제가 되면서 단편화를 일으키지만 미리 공간을 할당해서 쓰고 반납하면 위의 할당과 해제로 외부 단편화가 생기지 않으며 필요한 크기만큼 미리 할당을 하기 때문에 내부 단편화도 발생하지 않게 됩니다. 특히 할당과 해제가 많은 경우에 사용하면 효과적으로 사용할 수 있습니다.
읽어주셔서 감사합니다.
'공부 > 3D과제' 카테고리의 다른 글
구체 그리기 (0) | 2023.05.08 |
---|---|
큐브 그리기 (0) | 2023.05.08 |
ImGui에서 노드 추가 및 삭제와 탐색 (0) | 2023.05.04 |
전위, 중위, 후위 노드 추가 탐색 및 삭제 (0) | 2023.05.01 |
이진탐색트리, DFS, BFS, (전위, 중위, 후위) 순회 (0) | 2023.04.27 |