상세 컨텐츠

본문 제목

부스트코딩 뉴비챌린지 스터디 5주차 : 메모리 할당 malloc

IT/스터디

by J KIMS 2020. 9. 10. 22:15

본문

반응형

6) 메모리 할당과 해제

💡 메모리 할당이란?

메모리의 일부분을 가져와서 그곳을 가리키는 포인터를 주는 것.

malloc 함수는 할당한 메모리의 첫 바이트 주소를 반환한다.

※ 메모리의 동적 할당에는 malloc 함수가 필요하다 (배열의 크기를 입력받는 프로그램 등)

<stdlib.h> 헤더파일을 추가해줘야 함

 

💡 free

할당한 메모리를 반환한다. 컴퓨터의 메모리가 바닥나기 전에 사용하지 않는 메모리는 해제해주는 게 좋다.

 

💡 메모리 누수

malloc으로 메모리를 할당받은 후 해제하지 않으면 메모리에 저장된 값은 쓰레기 값으로 남게 된다. 이런 메모리 용량의 낭비를 메모리 누수라고 한다.

 

💡 디버깅도구 valgrind

메모리 누수를 찾기 위해 필요한 도구.

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    int num = 10;
    char *str = malloc(sizeof(char)*num); //malloc(할당하는 메모리 크기)
  
    return 0;
}

 

위와 같이 코드를 작성하고 커맨드 창에 valgrind ./a.out 를 입력하여 메모리 누수 오류를 확인할 수 있다. 

커맨드를 입력하면 처음엔 이상한 메뉴같은 것들이 나올텐데 memcheck를 입력해주면 된다.

 

 

LEAK SUMMARY 가 누수 요약인데 10바이트 한 블록이 누수된 것 같다.

 

cs50 샌드박스에서는 help50 valgrind ./a.out 를 입력하면 어떤 문제가 있는지 더 친절하게 알려준다.

 

혹시 malloc으로 할당받은 메모리를 free 해주는 걸 잊었니? 라고 묻는 걸 볼 수있다.

 

이 오류는 위에서 작성한 프로그램에 free(str)이라는 코드 한 줄을 추가해서 해결할 수 있다.

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    int num = 10;
    char *str = malloc(sizeof(char)*num);

    free(str); // 할당된 메모리 해제하는 코드 추가
    
    return 0;
}

 

💡 버퍼 오버플로우

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void)
{
    int num = 10;
    int *str = malloc(sizeof(int)*num);
    
    str[num] = 0; //str[10]에 0 대입 
    str[100000] = 0; //마찬가지로 오버플로우

    free(str);
    
    return 0;
}

 

만약 위와 같이 코드를 작성한다면 할당되지 않은 메모리 영역에 0이 들어가게 된다. (배열은 0부터 n-1까지 존재한다) 이를 버퍼 오버플로우라고 한다. str[1000] 도 마찬가지로 배열에 할당한 영역을 훨씬 초과한다.

 

valgrind로 검사해보면 '4바이트의 유효하지 않은 쓰기'라고 나온다. 여기서 쓰기(write)는 값을 수정한다는 의미이다. int의 크기는 4바이트인데 내가 10, 11번째 줄에서 할당하지 않은 영역에 값을 대입하려 했기 때문에 위와 같은 오류가 발생한 것이다.

 

 

반응형

관련글 더보기

댓글 영역