[C++11] unique_ptr / smart pointer
#smart pointer (스마트포인터)
1. 일반 포인터는 new를 이용하여 메모리를 할당 한 후 delete 연산을 호출 하지 않으면 메모리 누수가 발생한다.
2. 예기치 못하게 동적 할당된 메모리를 해제 할 수 없는 경우가 발생한다.
=> 스마트 포인터는 이러한 일반 포인터에서 발생할 수 있는 문제를 쉽게 해결하는 것에 도움을 주려고 등장했다.
헤더는 #incldue<memory>
# auto_ptr
객체를 할당하면 초기화가 된다
std::auto_ptr<ExampleClass>frist(new ExmplaeClass);
frist 라는 스마트 포인터 객체가 생성 되었다
std::auto_ptr<ExampleClass>second(first);
이때, first라는 객체는 second라는 객체에 복사가 될까? 이동이 될까?
답은 이동이 된다. 즉, second라는 객체가 참조, 소멸 등의 역할을 모두 하고 first는 NULL이 된다.
# unique_ptr (C++11)
말 그대로 고유해야 하는 포인터이다. 힙 영역에 동적으로 객체를 할당하고 그에 대한 소유권을 갖는다.
void func()
{
unique_ptr<double> p(new double(1.0));
...
}
int main()
{
func()
}
func 내에 선언된 p는 main 함수에서 func()함수가 실행되고 끝남과 동시에 소멸되게 된다.
즉, 굳이 delete를 해줄 필요가 없는 것이고 unique_ptr이 알아서 메모리 해제를 수행한다.
unique_ptr의 이동은 대입 연산자로 불가능
unique_ptr<double> p1(new double(1.0));
unique_ptr<double> p2 = p1
불가능 하다
데이터의 이동은 std::move()를 이용하여만 한다.
unique_ptr<double> p1(new double(1.0));
unique_ptr<double> p2 = move(p1);
이 경우 p1은 NULL이 된다.
할당된 값을 지우고 싶다면 reset을 사용하면 된다.
p1.reset
주의할 점은
const unique_ptr<double> p1(new double(1.0));
const로 선언된 포인터는 이동이 불가능하다.