끄적이는 메모장

[C++11] unique_ptr / smart pointer 본문

C, C++, C#/C++ 공부

[C++11] unique_ptr / smart pointer

밥보92 2018. 5. 30. 14:05
반응형

#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로 선언된 포인터는 이동이 불가능하다.

반응형

'C, C++, C# > C++ 공부' 카테고리의 다른 글

[C++11] make_shared  (0) 2018.05.30
[C++11] shared_ptr / weak_ptr  (0) 2018.05.30
[C++11] nullptr  (0) 2018.05.30
[C++11] static_assert  (0) 2018.05.30
[C++11] auto  (0) 2018.05.30