본문 바로가기
IT/PROGRAM

C언어 프로그램 메모리 누수 찾기

by SidePower 2020. 8. 21.

라인수가 몇천줄 안되는 작은 C언어 프로그램일지라도
개발자의 실수로 인해 메모리 누수현상이 생길수 있어요.

규모가 큰 프로젝트는 대부분 모듈(기능)별로 담당자가
있어서 그 모듈 담당자를 믿고 이용하게 될거에요.

뭔가 의심스러워도 자기가 맡고 있는 Job이 먼저다 보니
모듈 사용해보고 결과만 잘 나오면 된다고 생각합니다.

ㅋ 저도 그랬던가 같아요. 

왜냐면 저도 기간안에 결과물을 제출해야 되는데
괜히 남일 작은거 하나 봐줄려다가 더 커지게 되면 내 업무에 지장을 주니깐요.

프로젝트 끝나고 한두달 작은 메모리 누수가 있어도
요즘 서버 장비들이 워낙 사양이 좋다보니 누수라고 인지하지도 못하고
수개월,수년 메모리 사용량을 체크하지 않게 되요.

나중에 서버 멈춤현상이 생기거나 다운되거나 기타 오작동이 발생해야
수개월,수년 동안 문제없다가 왜 갑자기 이런 현상이 나는지 의아해하며
이제야 파악하게 됩니다.

C언어 프로그램 메모리 누수는 어떻게 생길까요?

사용자의 코딩 습관이나 코딩 실수 등 디테일하게 따지게 되면
케이스가 많치만 일반적인 유형별로 나누면
아래 네가지 정도면 대부분의 메모리 누수 현상을
찾을 수 있을 거라 생각됩니다.

 


메모리 할당 : malloc() 함수
메모리 해제 : free() 함수

① 동적 할당하고 해제하지 않고 끝날때

#include <stduo.h>
int main() {
char * p1;
p1 = (char *)malloc(1024);
strcpy(p1,"hello");
return 0;
}

(해결) free(p1);

② 하나의 포인트변수를 이용해서 여러곳에 메모리 할당할때
앞에 사용 후에 해제하지 않고 또 사용할 경우

#include <stduo.h>
int main() {
char * p1;
p1 = (char *)malloc(1024);
strcpy(p1,"hello");
p1 = (char *)malloc(20);
strcpy(p1,"good day");
free(p1);
return 0;
}

strcpy(p1,"hello"); 후에 p1값을 다 사용하고
free(p1) 으로 메모리 해제 된 후에
다시 p1 을 사용할수 있습니다.

(해결)
strcpy(p1,"hello");
free(p1);
p1 = (char *)malloc(20);

③ 할당된 크기가 다른 포인트변수 끼리 대입할 경우

#include <stduo.h>
int main() {
char * p1;
char * p2;
p1 = (char *)malloc(1024);
p2 = (char *)malloc(20);
strcpy(p2,"hello");
p1 = p2;
return 0;
}

p1 은 1024 크기로 메모리 할당됐고
p2 는 20 크기로 메모리 할당됐네요.
p1 = p2; 는 p1 에 p2 의 주소를 대입하므로
p1 의 1024 크기의 메모리를 가리키는 주소를 잃어버리게 되어
해제할수 없어지게 됩니다.
이런 코딩은 안좋은 코딩 습관입니다.

④ 동적 할당하고 포인트변수를 지정하지 않을 경우

#include <stduo.h>

char * make_mem() {
char * p3;
p3 = (char *)malloc(1024);
strcpy(p3,"hello");
return p3;
}

int main() {
make_mem();
return 0;
}

main안에 make_mem() 함수의 리턴값을 받아줄 포인트를 지정하지 않았네요.
(해결)
char *p1 = make_mem();

축약하면
C언어는 한가지만 기억하면 됩니다.
메모리 할당 했으면 할당 한 만큼 사용하고 바로 해제하기 입니다.

소스파일이 여러개고 담당자들도 많고 시간이 촉박하게 되면
나 자신은 철저하게 안전한 코딩을 해도
나도 모르게 놓치는 부분도 있고
협업하는 누군가가 실수할수도 있다고 생각합니다.

본인이 사용하는 함수라면 메모리 누수나
오작동이 있을수 있다는 생각을 가지시고
시간이 내어 자세히 소스를 볼 것을 권장합니다.

여기까지입니다.

좀 덥네요. ^^;
선풍기 강풍인데 더운 바람만 강풍이네요.

 

반응형

댓글