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

최지로님의 프로필 이미지

작성한 질문수

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

6.11 메모리 동적 할당 new와 delete

new로 할당받은 주소 출력해보고 delete한 후 또 출력하는거 안되는건가요?

21.07.04 22:32 작성

·

365

0

    int *ptr = new int{ 7 };

    cout << ptr << endl;

    cout << *ptr << endl;

    delete ptr;

    cout << ptr << endl;

    cout << *ptr << endl; 

이렇게 한번 출력후

메모리를 돌려 준 다음 다시 한번 출력해 보려는데

오류가 뜨면서 안되는데 

버전 업데이트 되면서 막힌 건가요?? 19버전입니다

검색해보니

작년인가 재작년 까지 올라온 글들만 봐도

가능하더라구요

이게 막힌게 맞는건가요?

답변 2

1

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

2021. 07. 04. 23:00

아 그리고 또 질문이

실무에선

delete ptr후

ptr = nullptr 꼭 해줘야 하는건가요??

안소님의 프로필 이미지

2021. 07. 06. 13:12

당연히 해주시는게 좋습니다. 

delete ptr 했다는건 ptr 포인터가 가리키는 힙 객체를 해제시켰다는 것을 의미합니다.

그러면 ptr 은 이미 없어져버린 공간의 주소를 가리키고 있는 것이 되겠죠? 

이런 상태일 때 ptr 을 통해 간접참조 한다면 위험한 예외상황이 발생하며 프로그램이 종료되어 버리겠죠.  비어있는 메모리에 접근하려는 것이니까요! (이 현상이 바로 제가 드린 첫번쨰 답변 현상입니다. 그래서 질문 주신 코드가 정상적인 코드가 아니라고 말씀 드린거에요!)

따라서 ptr 이 가리키는 주소는 없어진 공간을 가리키는 것이 되기에 당연히 nullptr 로 초기화 해주시는 것이 좋겠습니다.

추후 ptr 을 사용할 일이 없다면 ptr = nullptr 해주지 않아도 문제 없겠지만, 아주 만약에 ptr 을 사용하는 코드를 추가로 넣게 된다면 문제가 발생하겠죠? 아무쪼록 습관적으로 delete 해주었다면 그 포인터도 nullptr 로 초기화 해주실 것을 권장합니다.

코드 한 줄 더 늘어나는게 좀 귀찮긴 하지만 더 안전해지고 가독성도 좋아지니까요 :)

0

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

2021. 07. 04. 22:45

저번에 강의보고 할떈 분명 오류없이 됬고

00008123 뜨면서 vs에 컴파일러가 청소했다

의미로 나오는거라고 맨 밑에 질문과 같은 상황이였던

기억이 있는데 앞에 강의 듣다가 이해가 안되서
다시 들으러 오고 해보니 오류가 떠서 안되네요..

안소님의 프로필 이미지

2021. 07. 06. 13:09

어떤 오류가 뜨는 것인지도 구체적으로 말씀해주시면 답변 드리는데 도움이 됩니다. (컴파일 오류인지 런타임 오류인지에 대한 정보, 오류메세지 등등)

우선 저도 2019 버전임을 말씀드립니다.

이 코드는 오류가 나는 코드가 맞습니다. 8:08 강의 시간대에서도 오류가 날 수 있다고 말씀해주시구요.

저 같은 경우는 그냥 실행시키면 아래와 같이 (코드 -10754654... 개) 메세지가 보여지면서 종료되구요. (정상적으로 문제없이 종료된다면 코드: 0 개 메세지가 보여지며 종료가 되야 합니다. 강의의 교수님 화면에선 안뜨는데 안보여졌을 뿐 교수님 코드도 실행시 정상적으로 종료된게 아니에요)

디버깅으로 한줄 한줄 실행해보면 마지막 줄에 액세스 위반 에러가 발생하는 것을 확인할 수 있습니다. 

질문자님께선 어떤 오류가 뜬다고 말씀하는 것인지 알 수 없으나(사실 제 환경에서도 오류메세지로 뜨는게 아니라 그냥 코드 : -1073287382개 보여지고 종료되었다고 할 뿐이거든요) 위 코드는 강의에서도 설명드렸듯이 안전한 코드가 아니기 때문에 오류가 나는 것이 정상인 코드 맞습니다.