Computer Science
탄탄한 기반 실력을 위한
전공과 이론 지식 모음
Today I Learned!
배웠으면 기록을 해야지
TIL 사진
Flutter 사진
Flutter로 모바일까지
거꾸로캠퍼스 코딩랩 Flutter 앱개발 강사
스파르타코딩클럽 즉문즉답 튜터
카카오테크캠퍼스 3기 학습코치
프로필 사진
박성민
임베디드 세계에
발을 들인 박치기 공룡
임베디드 사진
EMBEDDED SYSTEM
임베디드 SW와 HW, 이론부터 실전까지
ALGORITHM
알고리즘 해결 전략 기록
🎓
중앙대학교 소프트웨어학부
텔레칩스 차량용 임베디드 스쿨 3기
애플 개발자 아카데미 1기
깃허브 사진
GitHub
프로젝트 모아보기
Instagram
인스타그램 사진

TIL

[250822] Day 12 - 메모리 동적할당과의 한 판 승부

sm_amoled 2025. 8. 24. 00:32

들어가며

오늘 다음주에 있을 프로젝트의 조를 꾸리는 시간이 있었다. 4인 1조를 꾸려서 프로젝트를 진행하면 되는데 내가 조장 리스트에 들어가있었다. (유후!) 학생들을 알아서 모집해야 하는 시스템이라 사실 조금 걱정했었는데, 같이 하자고 먼저 연락해주는 분들이 많았어서 빠르게 모집 마감을 할 수 있었다. 후 ㅎㅎ. 인생을 잘 살아둬서 다행이야. 사실 프로젝트 하면 Git 사용하는 방법도 가르쳐주고 내가 프로젝트 팀원들의 코드리뷰도 다 해주려고 했는데, 기획과 발표를 포함해서 단 5일 안에 진행이 되어야하다보니, 다 할 수 있을지는 잘 모르겠다. 그저 열심히 해봐야겠다는 생각 뿐이야.

오늘 C언어 시험을 쳤는데, 너무 집중을 안했나,,, 틀린문제 6개 중에 1개는 확실히 모르는거 / 2개는 다시 보니 맞는말인거 / 3개는 주의를 안해서 틀린 문제들이였다. pa 인데 *pa 를 써넣었다거나, 알고있는 bit 연산 규칙도 잘못 다뤘다거나… 좀 아쉽네 ;ㅅ;

오랜만의 시험이라 그렇다 생각하고, 다음번 시험에서는 조금 더 집중해서 문항들을 살펴볼 필요가 있겠다.

오늘의 키워드

메모리를 할당 받을 때는 잘 받았나 체크하기

메모리 할당 함수를 사용할 때는

// 메모리를 재할당할 때 ptr 변수에 바로 넣지 않기
p = realloc(p, SIZE);

int* temp_p = realloc(p, SIZE);

메모리 해제 실수 줄이기

할당받은 메모리를 해제할 때, 아래처럼 매크로를 작성하면 [할당해제 + 포인터에 0 대입] 을 한 번에 처리할 수 있기 때문에 실수를 줄일 수 있어서 유용하다.

#define FREE(ptr) do { \
    free(ptr); \
    (ptr) = NULL; \
} while(0)

FREE 시 동적할당받은 메모리 포인터에 0을 대입하는 것은 아래 이유를 가짐.

// 1. dangling pointer 제거
free(p);
*p => 읽기 엑세스 위반 throw 발생

// 2. free 시 런타임 오류 제거
free(p);
free(p); => 이미 해제한 주소 해제 시도 시 에러 발생

free(p);
p = NULL;
free(p); => 0 주소를 해제하는 것은 정상적으로 실행 가능

왜 매크로 블럭이 do { … } while(0) 이냐면

  • 단순히 세미콜론으로 한 줄에 끝낸 경우
#define FREE(ptr) free(ptr);(ptr)=NULL;

if(true)
    FREE(ptr);

// 위 코드가 이렇게 변경됨
if(true)
    free(ptr);
    ptr = NULL;;

// 그러면 이렇게 해석될 수 있음
if(true)
    free(ptr);
ptr = NULL;;
  • 중괄호로 감싼 경우
#define FREE(ptr) do { \
    free(ptr); \
    (ptr) = NULL; \
}

if(true)
    FREE(ptr);
else
    puts("");

// 위 코드가 이렇게 변경됨
if(true)
    { free(ptr); ptr = NULL; };
else
    puts("");

// 그러면 이렇게 해석될 수 있음
if(true) {
    free(ptr);
    ptr = NULL;
};
// if문 구조의 끝 + 짝 없는 else 등장
else
    puts("");
  • (콤마 , 연산자)로 감싼 경우
#define FREE(ptr) (free(ptr), (ptr)=NULL)

// 요거슨 expression
// 이런 이상한 코드가 작성될 수 있음.
int result = FREE(ptr);

do-while은 반드시 세미콜론으로 끝나야하는 문장임. 따라서 FREE(ptr); 처럼 사용할 때 자연스럽게 세미콜론을 붙이더라도 문법적인 문제가 없음!

매크로 블럭을 쓰고 싶으면 do-while(0) 블럭을 사용하자.

320x100