• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

이해한게 맞는지 질문드립니다!

21.04.16 23:34 작성 조회수 128

2

안녕하세요~

항상 자세한 답변 감사드립니다

#include <stdlib.h>

int count() {

    double* ptr = NULL;

    ptr = (double*)malloc(30 * sizeof(double));

    for(int i = 0; i < 30; i++) {

        *(ptr + 1) = i;

}

}

int main() {

    count();

}

이렇게 작성한경우,

ptr에 할당된 메모리 공간들은 malloc때문에 메모리 영역 중 heap 영역에 240 바이트만큼 저장된다는건 알겠는데요,

만약 main문에서 count가 호출될때 ptr은 지역변수니까 스택에 저장되어있겠죠?

그런데 count가 종료될 경우 스택영역에서 pop되니까 메모리공간에 for문 돌면서 초기화 해준 값들이 분명 heap영역에 존재는 하는데 이걸 참조를 못하게 된다 이소리인가요?

중간에 마치 친구 전화번호를 종이에 적어서 가지고있었는데 잃어버렸다. 근데 전화번호적은 종이를 잃어버렸다고 친구가 사라지는건 아니다 라고 비유를 드셨는데 맞게 이해한건지 궁금합니다.

ps. 혹시 for문에서 double이 8바이트니까 30번돌면 되는거 맞나요?

답변 1

답변을 작성해보세요.

3

안소님의 프로필

안소

2021.04.18

네 제대로 이해하고 계십니다. 저 비유가 딱 맞아요! 집 주소가 적힌 종이를 잃어버려서 집을 영영 찾지 못하게 된 경우와도 같아요. 지역변수인 ptr은 사라지는데, heap 은 프로그래머가 직접 free 코드로 메모리 해제 시켜주어야지만 메모리가 해제되므로 ptr 이 참조하고 있던 그 힙 메모리는 count 함수가 호출이 끝나도 계속 메모리에 자리를 차지하고 있게 됩니다. 근데 이 메모리의 주소를 ptr 이 가지고 있엇는데 ptr 이 사라졌으니 이 메모리에 접근할 수 있는 방법은 영영 사라진 것이 되겠죠. 해제도 못하고 이도저도 못할거에요. 그런데 메모리에 용량은 차지하고 있으니 비효율적이죠. 이런 현상이 바로 "메모리 누수"입니다. 그래서 힙 메모리를 사용하시면 잊지 않고 free 코드로 메모리 해제해주셔야 해요. 특히 질문주신 경우처럼 이 메모리를 참조하는 포인터의 수명이 한정적이라면 더더욱 까먹지 말고 free 코드를 써주어야겠습니다.

ps . 네 맞습니다 포인터 산술연산 기억을 되살려보시면 될 것 같아요!  ptr은 double 을 가리키는 포인터이기 때문에 *(ptr + 1) 은 곧 주소값이 8 만큼 증가된다는 의미와도 같습니다. 그러니 30번 돌리시는게 맞습니다.