●메모리 누수●
메모리 누수(Memory Leak)란 간단히 말하자면 오늘 수업에서 배운 new를 사용하여 동적할당한 메모리를
사용후 할당을 해제 하지않고 그대로 남겨두어 의미없이 메모리의 공간이 차지되어있는 것을 말한다.
RAM의 크기에 따라 용량의 차이는 있으나. 보통 프로그래밍에서 사용되는 용량에는 한계가 있기 떄문에
정해진 공간내에서 최대한 효율적으로 공간을 사용하기 위해서는 메모리 누수에 주의 하여야 한다.
만일 프로그램이 복잡하거나 다양한 이유등으로 메모리 누수가 발생할 경우 메모리의 공간이 나중에
부족하게 되고 성능저하 및 치명적인 오류가 발생할 수 있다.
>>참고 자료1<<
디버깅 시 메모리 누수 찾는 방법
(아직 어려운 부분이므로 간단하게 읽어보고 참고만함. 차후 상세히 보기)
https://woo-dev.tistory.com/84
>>참고자료2<<
https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC_%EB%88%84%EC%88%98
나무위키를 참고하며 해당 내용 세부사항에 있는 다른 사항들도 한번씩 보도록 한다.
●가비지 컬렉션/컬렉터(GC)●
가비지 컬렉션은 간단히 말해 데이터중 쓸모없는(쓰레기)데이터의 모음(컬렉션)이다.
동적할당으로 할당한 데이터중 사용이 끝났거나 사용되지않는 데이터를 자동으로 선별하여
삭제하고 데이터 저장공간을 보다 쾌적하게 관리하여 주는 작업이다.
가비지 컬렉터는 C.C++처럼 저수준 언어 프로그램에는 없는 기능이며
JAVA, C#처럼 고수준 언어 프로그램에 있어 자동으로 정리를 해주는 편리한 기능이다.
C++ 에서 자동적으로 쓸모없는 데이터를 관리해주는 프로그램이 없는것이 불편할수도있으나
수동적인 방식으로 직접 관리해줄수 있다고 한다.
예를들어 '레퍼런스 카운터'가 있다.
레퍼런스 카운터는 직접 정의하여 사용하게되는데 레퍼런스 수를 관리하는 클래스를 만들고
상속받아 클래스를 만드는 것이라고 한다.
참조하는 함수,클래스 등의 사용이 한개씩 늘어나면 카운터를 +1 시키고 줄어들면 -1을 시킨다.
카운터가 0이되면 해당 메모리를 할당 해제 하는 방식이다.
또다른 기능으로는 '스마트 포인터'가 있다.
[Unique], [Shared], [Week] 3가지의 포인터가 있다.
#include<memory> 를 통하여 사용하게 된다.
[Unique] - 하나의 메모리에 하나의 포인터만 만든다. //유니크 - 특별한거 하나
[Shared] - 하나의 메모리를 여러 포인터가 가르킬 수 있게 만든다. //쉐어 - 공유하다 - 여럿이쓸수있다.
위의 레퍼런스 카운터 방식으로 참조하고 있는 레퍼런스 갯수를 래핑 하고 있는 클래스여서
레퍼런스카운터가 0이되면 메모리 할당을 해제 하게 된다.
<포인터 학습 초기단계이므로 아직 이해되지 않는부분들이있으므로 간단한부분들이라도 기억해둔다>
위의 두가지 방식은 아직 잘 모르는 방식이다.
C++을 공부하는중이니 메모리관리는 C++의 직접 메모리 관리 방법인 new / delete 를 확실히 사용하도록한다.
new 로 메모리를 할당받고 다사용하면, 꼭
delete 로 마무리하여 사용이 끝난 메모리는 깔끔하게 정리한다.
●메모리 단편화●
<< 출처 : 나무 위키. 메모리의 단편화를 이해하는데 도움이 되었다.
단편화는 기억 장치의 빈 공간과 할당된 공간들이 깔끔하게 정리되어있지않고
여러개의 단편 처럼 나뉘어져 있는 현상을 말한다.
단편화가 심한경우 효율적으로 공간이 사용되지않고 있으므로 읽고 쓰는 수행 속도가 늦어지는 문제점이 생긴다.
단편화의 종류
1. 내부 단편화 - 의도된 바 없이 할당되고 해제하지 않아 공간이 낭비되고 있는 것.
2. 외부 단편화 - 여유 공간이 여러 조각으로 나뉘는 현상. 다양한 크기의 영역을 할당하고 남은공간 이 여럿으로 나뉘는 것.
3. 자료의 단편화 - 기억장치 내의 자료가 여러 조각으로 나뉠 때 일어나는 것. (이부분은 이해가 잘 안된다)
단편화 해결 방법 으로는 통합과 집약이 있다.
통합이란 기억공간 내에 인접한 둘 이상의 공백을 그들 사이의 경계를 없애고 하나의 공백으로 합치는 것.
(위의 GIF 이미지를 보면 이해하기 쉽다/사이사이 빈공간을 없도록 하는 것)
집약이란 기억공간 내에 섞여있는 사용중인 영역과 빈 영역을 각각 한쪽으로 몰아 빈 영역들을 하나로 모으는 것.
(ex.디스크조각모음 / 위의 GIF 이미지에서 사용중인 공간 위쪽이아닌 아래쪽에 조각들을 넣어뒀다 어느정도 크기로 모아서 위쪽에 합치는 것 이다.)
'공부' 카테고리의 다른 글
C++ Switch 의 특징 추가 (0) | 2022.11.02 |
---|---|
방위 이름짓기 참고 (0) | 2022.10.28 |
상수와 포문을 이용한 별찍기 과제 (0) | 2022.10.27 |
달팽이 배열 알고리즘 (0) | 2022.10.26 |
메모리의 관리(구조/스택프레임/동적할당) (2) | 2022.10.26 |
댓글