프로그래밍 공부
작성일
2023. 3. 31. 16:22
작성자
WDmil
728x90

malloc은 데이터의 동적할당을 이루어지게 한다.

데이터 범위 동적할당을 이루어지게 하여 펑션단위에서 배열을 만들어서 포인터로 리턴을 해줄 수 있다.

이러한 방법을 통해 더 쉽게 데이터범위를 지정하고 주소값을 반환할 수 있어 코드를 작성 할 때 편리하게 쓸 수 있다.

그러나, malloc은 데이터 할당 이후에 데이터를 free로 날려주어 데이터할당을 종료해주어야 낭비되는 메모리가 없이 최적화 되게 동작시킬 수 있음으로 이에 유의하여 작성해야 한다.

밑 코드 예시를 확인해보자.

이런식으로 데이터 할당을 종료할 수 있다.

free 함수를 사용하여 데이터 할당을 종료시켜주어야 한다. 위 FREE는 #define으로 명령어를 만들어서 동작시키게 만들었다. 그는 밑과 같다.

이렇게 define으로 free후 주소값을 NULL로 초기화 시켜줄 수 있다.

이러한 데이터할당 방법을 사용하여 free로 데이터를 날려주고 주소값을 NULL로 없애주어야 한다.

 

NULL로 날려주지 않을 경우 데이터를 주소로 참조하려다가 할당실패로 정상값이 리턴되지 않거나 권한문제로

종료될 수 있어 코드의 오류를 찾기 힘들 수 있음으로 NULL로 항상 초기화 시켜주도록 하자.

define으로 사용하지 않을경우

free(ptr);

ptr = NULL;

을 항상 붙여서 사용하여야 한다.


동적할당에는 2가지 방법과 1가지 메모리 수정방법이 있다.

각각 malloc, calloc, realloc 이라고 하는데 예시를살펴보자.


malloc

malloc은 데이터 선언과 같이 포인터로 할당된 데이터주소값을 반환해주는 것이고. 기본적으로

void포인터로 만들어지기 때문에, int* 나 double*같이 형변환을 하여 포인터에 입력해주어야 한다.


calloc

calloc은 데이터할당 시 데이터선언과 동시에 메모리에 있던 쓰레기값을 0으로 초기화하여 사용할 수 있다.

그럼으로 malloc보다 더 안정성 있게 사용할 수 있다. 그러나, 인수를 2개 받아오기 때문에 사용에 불편함이 있을 수는 있다.


realloc

realloc은 이미 할당된 데이터의 범위를 바꾸어주는 역활을 한다. 위치포인터를 받아오고 size만큼 데이터범위를 재설정 해준다. 그럼으로써 이미 지정된 데이터범위를 수정할 필요가 있을 때 사용하게 된다.


이러한 데이터 동적할당의 방법이 있으나, 이러한 메모리할당을 사용함으로써 생기는 다양한 문제점이 있다.


내부 단편화 문제는 스테틱 구조를 살펴보면 알 수 있는데,

 

각각 메모리의 범위를 설정하는 방법에서, 가장 큰 메모리기준으로 작은 메모리를 하나씩 채워넣고 못넣을 경우, 공간이 조금 남아도 다음으로 넘기는 식의 메모리 할당을 사용한다.

 

예를들어 다음과 같다.

각각 사이즈가 다른 메모리를 스트럭쳐에 선언한다고 가정해보자.

 

1byte 3byte 남는 메모리(4byte)
8byte

 

그러면 위와 같은 방식으로 메모리를 할당해주게 되는데, 남는메모리가 생김을 확인할 수 있다.

이러한 잉여 메모리가 남는데 그곳을 활용할 방안이 없어서, 메모리 최적화 문제가 생길 수 있다.

이러한 메모리 내부에 단편적인 문제가 생겼다. 하여 내부 단편화 문제 라고 한다.


외부 단편화 문제는 내부 문제를 내부 단편화 문제라고 하듯, 저장된 메모리의 외부에서 발생하는 문제를 말한다.

 

메모리에 데이터가 저장될 때 OS가 임의적으로 포인터 위치를 배정하여 저장하게 되는데, 중간중간 메모리 데이터의 공간이 남아있는데도 불구하고, 저장해야하는 데이터의 사이즈가 공간보다 클 경우 그곳에 저장하지 못함으로써 낭비되는 공간을 이야기한다.

 

예를들어 다음과 같다.

1byte 메모리 저장공간에 어떠한 데이터 3개를 저장한 뒤 한개를 삭제하고 3byte를 저장하려고 한다 가정해보자.

 

1byte 1byte 1byte

위와 같은 방식으로 저장될 수도 있고 아닐수도 있지만, 이렇게 저장되었다고 가정하고 해보자.

 

중간에 1byte를 지웠다.

1byte   1byte

위와같이 될것이다.

 

이번에 3byte를 저장하려고 해보자.

3byte
1byte [3byte는 큼 으로 들어갈 수 없음!] 1byte

byte사이즈가 다르기 때문에 데이터가 들어갈 수없는것을 직관적으로 확인할 수 있을것이다.

그렇다면 이것이 저장되려면 다음과 같아야 될 것이다.

 

1byte 잉여공간 1byte [ 3byte ]

 

위와같이 잉여공간이 남는것이 데이터메모리의 외부에서 발생함으로 외부 단편화 문제 라고 한다.


메모리 누수 현상은 매우 간단하다.

 

malloc이나 calloc같은 동적할당을 하고나서 데이터 할당 해제를 해주지 않아서 발생한다.

컴퓨터는 할당된 메모리가 사용되는지 아닌지을 알 수 있는 방법이 사용자가 직접 알려주는것 말고는 알 수 없다.

이 메모리가 지금당장은 사용되지 않는다고 해도 나중에 사용될수도 있는것 아닌가? 그래서 메모리를 할당해주고나서

이 메모리를 사용하지 않는다고 컴퓨터에 알려주어야 한다.

 

이러한 과정을 거치지 않으면 할당해준 메모리 사이즈 만큼을 활용할 수 없음으로

 

만약, 계속 반복되는 코드를 동작시켰을 때 메모리를 할당만 해주게되면 언젠가 메모리사이즈 부족으로 오버플로우 가 발생하여 컴퓨터가 멈추게 될것이다. 할당해줄 수 있는 메모리가 없어지기 때문이다.

 

메모리를 내가 짠 프로그램만 사용하는것 이 아닌 OS나 다른 기반프로세스도 사용해야 하기 때문에 메모리가 다 차버리면 큰일이 난다!

 

이러한 형태가 세면대 같은 수도꼭지를 잠그지 않아서 계속 물이 사용되는 경우와 비슷해보이지 않는가?

 

우리는 이런 할당해제를 잘 해주지 않음으로 서 발생하는 메모리의 낭비현상을 메모리 누수 현상 이라고 한다.

728x90