인프런 커뮤니티 질문&답변

jsh4059님의 프로필 이미지
jsh4059

작성한 질문수

홍정모의 따라하며 배우는 C++

6.11 메모리 동적 할당 new와 delete

6.11 질문있습니다

작성

·

176

1

while(true)

{

int *ptr=new int;

cout<<ptr<<endl;

}

이렇게 코딩하면 메모리가 계속 증가하는 이유가 뭔가요?새로운 포인터를 계속 만들어내서 인가요?

답변 4

4

아닙니다. 중괄호 밖으로 나가면 없어지는건 힙메모리의 주소를 가지고 있는 ptr 변수이고(덧 붙여서 모든 지역 변수는 스택메모리에서 관리가 됩니다.) 해당 힙 메모리 자체는 사라지지 않습니다. 힙 메모리는 범위와는 무관해요! 오직 delete 직접 해주어야만 반납되는 메모리입니다. 그래서 delete 을 해주지 않으면 메모리 누수가 생길 수 있다고 하는 것이에요! delete 처리 되지 못하면 프로그램이 실행되는한 자리 계속 차지하고 있습니다. 굉장히 비효율적이죠 ㅠ 프로그램 종료되야 비워집니다.

ptr변수가 힙 메모리의 주소를 담고 있었으니까 ptr이 수명범위를 벗어나서 사라지면 해당 힙메모리에 접근할 수 있는 방법이 영영 사라지겠죠. 집 주소가 적힌 종이를 잃어버린 격이니까요. 질문자님이 주신 코드를 실행하면 이렇게 찾을 수 있는 방법이 없어진 미아가 된 채로 힙메모리에서 자리만 차지하고 있는 메모리가 무한으로 많아지는 현상이 발생한다고 볼 수 있겠습니다.

3

안녕하세요!

int * ptr = new int; 👉 new 를 사용하여 int 데이터를 힙 메모리에 생성하고, 이의 주소를 ptr 포인터에 할당받는다는 의미입니다.

포인터인 ptr은 선언된 곳이 while의 중괄호의 범위이기 때문에 while 의 하나의 반복 안에서만 수명을 가지는 지역변수입니다. 그래서 정확히 말씀드리자면 새로운 포인터를 계속 만들어내기 때문에 메모리를 증가하는 것이 아닙니다. 포인터 ptr은 while 의 다음 반복으로 넘어가면 사라집니다! 그리고 다음 반복해서 int* ptr 선언에 의해 새로운 ptr이 다시 생겨나죠.

메모리가 증가하는 이유는 new 를 이용한 int 데이터의 힙메모리 할당 때문입니다. 이번 강의에서 delete 을 공부하셨을텐데 new로 생성한 힙메모리 내의 데이터는 개발자가 직접 delete 을 사용하여 해제시켜주지 않는 한 계속해서 힙 메모리 내에 공간을 차지하고 있게 됩니다. delete 시키지 않고 다음 while 반복으로 넘어가 새로운 메모리를 할당받고 ptr에 주소 넣고 또 새로운 메모리를 할당받아 ptr에 주소 넣고 이 같은 과정을 무한히 반복하게 되기 때문에 메모리가 계속 증가한 것입니다. 

이렇게 해주시면 메모리가 더 이상 증가하지 않을 것입니다. while 한번 반복 때마다 힙 메모리 생성하고 주소 출력 후 바로 삭제해주기 때문입니다. 

0

jsh4059님의 프로필 이미지
jsh4059
질문자

와 이해가 다 됐어요 설명을 정말 잘하시는거 같아요 감사합니다

0

jsh4059님의 프로필 이미지
jsh4059
질문자

new로 생성한 힙메모리를 가진 변수라 하더라도 중괄호 밖으로 나가면 메모리를 반납하는걸로 알고있는데 아닌가요? 그리고 new로 생성한 힙메모리는 그럼 delete를 만나지 않으면 영원히 안돌려지는건가요?

jsh4059님의 프로필 이미지
jsh4059

작성한 질문수

질문하기