C++의 delete 연산자에 대한 질문입니다.
조회수 781회
C++에서 new는 if(!p) 를 사용하여 메모리 할당 여부를 확인하는데 delete는 메모리 반납을 했는지 확인하는 방법이 있나요? 그리고 new를 사용하여 메모리를 할당 받았을 때 delete는 메인에서 사용하여야 좋은가요 소멸자에 사용하는게 좋은가요 아니면 어디에 사용해야 좋은가요?
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* > 도 있습니다.
댓글 입력