C++의 delete 연산자에 대한 질문입니다.

조회수 781회

C++에서 new는 if(!p) 를 사용하여 메모리 할당 여부를 확인하는데 delete는 메모리 반납을 했는지 확인하는 방법이 있나요? 그리고 new를 사용하여 메모리를 할당 받았을 때 delete는 메인에서 사용하여야 좋은가요 소멸자에 사용하는게 좋은가요 아니면 어디에 사용해야 좋은가요?

  • 책을 보세요...책이 더 자세한데 이곳에다 자세한 설명을 요청하는 것은 서로 답답하지 않나요? new 를 했던 곳에서 delete 를 하는 것이 기본이에요. 즉 생성했던 함수에서 마지막에 제거하는 것이 가장 바람직한겁니다. 그리고 스마트 포인터를 고려해보세요. 이젠 필수입니다. 정영훈 2020.4.14 08:00
  • 감사합니다 :) 김선현 2020.4.14 16:44

1 답변

  • C++에서 new는 if(!p) 를 사용하여 메모리 할당 여부를 확인하는데 delete는 메모리 반납을 했는지 확인하는 방법이 있나요?

    컴파일러 옵션을 통하거나 new (std::nothrow) T와 같은 식이 아닌 이상, new는 메모리 할당에 실패할 경우 std::bad_alloc 예외나 생성자가 던지 예외를 던집니다. 예외가 발생하지 않는 한 포인터에 대입된 주소는 항상 할당된 메모리 주소이기에 if를 통한 확인은 무의미합니다.

    delete의 경우 입력한 메모리 주소를 반드시 해제 합니다. 소멸자에서 예외를 던질 경우, 소멸자 루틴이 완전히 실행되지 않아 자원 해제에 문제가 발생할 수 있지만, 적어도 delete 에 입력한 메모리는 해제가 됩니다. 따라서 확인할 필요가 없으며, C++ 언어 범위 내에서 가능한 방법도 없습니다.

    만약 new가 예외를 던지지 않았는데 메모리를 생성하지 못했다거나 delete가 메모리를 해제하지 않았다면, C++ 언어 구현의 버그나 시스템의 버그입니다. 이는 C++의 영역을 벗어나는 문제입니다.

    그리고 new를 사용하여 메모리를 할당 받았을 때 delete는 메인에서 사용하여야 좋은가요 소멸자에 사용하는게 좋은가요 아니면 어디에 사용해야 좋은가요?

    소유권을 가진 위치에서 삭제 하는 것이 맞습니다. new로 생성했다고 무조건 main()에서 해제를 해야한다느니 소멸자에서 해제해야한다는 규칙은 없습니다.

    메모리의 잘못된 소유권 관리는 메모리 누수를 야기 시켰기에 C++ 11 부터는 std::unique_ptr, std::shared_ptr와 같은 스마트 포인터를 도입하였습니다. 포인터의 소유권에 대한 미묘한 표현을 좀더 명확히한 owner< T* > 도 있습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)