• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

delete 와 nullptr 질문입니다.

19.05.31 01:11 작성 조회수 1k

6

교수님 안녕하세요!

좋은 강의 재미있게 듣고 있습니다.

9분 경의 null을 delete 하게 되면 문제가 발생할 수 있다고 하셨습니다. 그것이 어떠한 문제인가요?

제가 먼저 검색을 해본 결과, delete는 null에 대해서 safe 하다고 합니다. delete 안에 null을 검사하는 코드가 있어서 null을 미리 검사하지 않고 써도 무방하다는 의견을 보았습니다.

이것이 최근에 업데이트 된 최신 c++에서 생긴 것이라 영상과는 다른 것인지, 아니면 뭔가 다른 위험성이 있기 때문에 그런 것인지 궁금합니다.

 

답변 1

답변을 작성해보세요.

9

안녕하세요? 좋은 질문입니다. reference manual을 찾아보니까 delete와 free 모두 NULL(nullptr)에 대해서는 'do nothing' 이라고 하네요. 제가 공부하던 때에 비교해서 컴파일러가 달라진 것인지에 대해서는 확인하기가 어렵네요.

https://en.cppreference.com/w/cpp/language/delete

https://en.cppreference.com/w/c/memory/free

delete 전에 nullptr을 검사해줘야 하느냐에 대해서는 

- 모던 C++에서는 프로그래머가 메모리 관리에 신경을 '덜' 쓰도록 유도하고 있습니다. 스마트 포인터를 사용할 수도 있습니다. 그러나 performance에 '매우' 민감한 경우는 얘기가 다릅니다.

- 자료구조나 알고리즘 공부를 하시다 보면 nullptr을 지우려는 시도를 하는 것 자체가 구현에 문제가 있다는 의미일 수도 있습니다. 이런 일들은 주로 런타임에 일어나기 때문에 알기가 어렵습니다.  공부하는 단계에서는 nullptr에 대해 민감하게 생각하시는 것이 장기적으로 좋은 습관이라는 것이 저의 견해입니다. 특히 한 번 지운 포인터를 한 번 더 지우도록 구현하는 경우는  (delete가 내부에서 처리를 해주기 때문에) 실행 시 아무런 문제가 발생하지 않더라도 공부에는 매우 안좋습니다.

- 정리하자면, 실무에서 nullptr 검사 없이 delete을 사용하고 싶다면 차라리 smart pointer를 써서 delete에 대해 신경을 아예 안쓰는 구조를 만드는 것이 더 '현대적'입니다. 그러나 공부하는 과정에서는 런타임에 포인터가  nullptr인지 아닌지 예측할 수 있는 코드를 작성하시는 것이 장기적으로 매우 중요합니다.

또 좋은 질문 남겨주세요!