블로그 이미지
본문 바로가기

언어/C++

Null 포인터를 delete 하면?

반응형

 

서론

 

이동 생성자에 대해 학습하던 중, 클래스를 반환 형식으로 하는 함수에서 이름 없는 임시 객체가 생성 될 때, 이동 생성자를 호출한다. 이때, 원본 객체가 이름 없는 생성자에게 포인터를 넘겨준다면 원본 객체의 포인터는 NULL Pointer가 될 것이다. 근데 여기서 소멸자를 호출하게 되는데 NULL 포인터를 delete 예약어를 사용하게 된다면 오류가 뜰 것인가? 미리 NULL인지 체크하는 조건문을 달아줘야 하는가?

 

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

 

delete expression - cppreference.com

Destroys object(s) previously allocated by the new-expression and releases obtained memory area. [edit] Syntax ::(optional) delete   expression (1) ::(optional) delete[] expression (2) expression - one of the following: [edit] Explanation Given the point

en.cppreference.com

If `ptr` is a null pointer value, no destructors are called, and the deallocation function may or may not be called (it's unspecified), but the default deallocation functions are guaranteed to do nothing when passed a null pointer.

결론

결론부터 말하자면 NULL 포인터는 delete 내부에서 검사하고 메모리 해제를 진행하지 않는다고 한다. 내가 학습한 C++11 기반 강의 책에서 본 예문을 보고 ‘저렇게 하면 null pointer를 해제하려 했다는 오류가 뜨지 않나?’ 라고 생각해서 확인해봤더니, 실제론 아무 오류 없이 작동 하는 것을 확인할 수 있었다. 자꾸 C언어 기반으로 C++를 학습하려고 하니 이런 불편한 점이 많다고 생각한다.

c++ 14부터만 가능한 것으로 보인다.

 

아무튼 delete에서 알아서 검사하니 직접 조건문으로 체크할 필요는 없다는 말이다. 그래도 이런 기능이 delete 내부에 있으니까 신경쓰지 않아도 된다는 것을 알고 있는 것이 좋다고 생각한다.

 
반응형