• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

동적할당의 메모리에 관해 질문이 있습니다

22.04.13 17:46 작성 조회수 112

0

안녕하세요. 동적할당을 배우기 시작한 프로그래밍 입문자입니다.

동적할당에 관해 궁금한 점이 있어서 질문드리게 됐습니다.

 

int main()

{

                {

                          int a = 5;

                }

       a = 7; (오류)

      return 0;

}

위의 코드에서 a는 스택메모리에 저장되어 있습니다. 스택은 괄호를 빠져나가는 순간 메모리가 소멸하기에

뒤에 a 값을 할당하려는 것(a=7)은 오류가 되잖아요. 

근데 동적할당의 경우 스택이 아니라 힙에 저장되며, 무엇보다 괄호를 빠져나가는 순간 메모리가 소멸하는 것이 아닌 delete를 해줘야 메모리가 다시 os에 반환되는 거잖아요.

반대로 delete하기전엔 메모리가 소멸이 안 된다는 거잖아요

따라서 위의 상황처럼 스택의 상황과 전혀 다르기에 비슷한 상황을 만들어봤습니다.

 

int main()

{

                {

                       int* b = new int {5};

                }

       *b = 7;  (오류)

        return 0;

}

b는 힙에 저장되어 있고 delete를 하지 않는 한 메모리가 사라지지 않으니 return 위에 있는 b에 값을 할당하는 내용이 오류가 아닐 줄 알았는데 오류라고 뜨네요.

왜 오류가 뜨는지 알고 싶습니다!

답변 1

답변을 작성해보세요.

1

강민철님의 프로필

강민철

2022.04.14

안녕하세요 :)

해당 변수에 접근 가능한 영역, 즉 접근 가능한 scope를 고려하셔야 합니다.

힙 영역에 저장되었다고 해서 모든 코드 영역에서 접근이 가능한 것은 아닙니다.

현재 변수에 접근 가능한 scope에 있느냐는 엄밀히 말하자면 별개의 문제입니다.

(스마트 포인터를 학습하셨는지 모르겠으나,)

스마트 포인터가 아닌 다음에야 new로 할당받은 변수는

동일한 scope에서 접근하고, 동일한 scope에서 delete을 해주셔야 합니다.

그렇지 않다면 말씀하신 대로 지속적으로 힙 영역의 메모리만 잡아먹게 되고,

메모리 누수가 발생하기 때문이지요.

감사합니다.

yahang2008님의 프로필

yahang2008

질문자

2022.04.14

메모리가 저장되어있는 것과 코드에서 접근 가능한 것은 다른 문제라는 것이군요. 감사합니다!