SW/C++

[ C++ ] 스마트 포인터 개념 및 예제

얇은생각 2018. 11. 16. 11:36
반응형

스마트포인터


개발자 분들에게 가장 큰 근심은 포인터의 메모리 할당과 해제라고 할 수 있습니다. 아무리 메모리에 신경을 쓴다고 해도 하나라도 놓치게 된다면 메모리 누수가 발생하기 때문입니다. 다른 객체지향 언어인 자바는 다행히도 포인터를 사용하지만 자동으로 해제할 수 있도록 설계가 되어 있습니다. 아무래도 C++보다는 그래서 쉬운 편인 것 같습니다. 따라서 C++에서도 자동으로 메모리를 해제해주도록 하는 기능이 c++11에 추가되었습니다. 스마트 포인터의 이름이 왜 스마트인지 이제 느낌이 오시나요?



shared_ptr


shared_ptr<Type> mySmartPtr (new Type);
cs


선언 방식은 위와 같습니다. shared_ptr을 사용하기 위해서는 참조 카운트의 개념을 알아야 합니다. 참조 카운트는 해당 메모리를 참조하는 포인터가 몇개인지 나타내는 값입니다. shared_ptr로 선언된 포인터가 가리키는 메모리 공간은 참조 카운트가 0이 되는 순간 메모리를 해제하는 것입니다. 예제를 통해 확인해보겠습니다.


#include <iostream>
#include <memory>
using namespace std;
 
int main()
{
    shared_ptr<int> s(new int);         // 참조 카운트 1
    *= 10;
    cout << "참조 카운트 1" << endl;
    cout << *<< endl;
 
    shared_ptr<int> t = s;              // 참조 카운트 2
    *+= 1;                            // 11로 증가
 
    cout << "참조 카운트 2" << endl;
    cout << *<< endl;                 // 증가된 값인 11 출력
    cout << *<< endl;
 
    shared_ptr<int> u = t;              // 참조 카운트 3
    cout << "참조 카운트 3" << endl;
   *+= 1;
 
    cout << *<< endl;                 // 증가된 값인 12 출력
    cout << *<< endl;
    cout << *<< endl;
 
    return 0;
}
cs


예제의 의미를 이해하시나요? 참조된 값에 따라 카운트는 늘어나고 참조된 값을 변형하면 그 값에 따라 모두 값이 변합니다. 만약 main() 함수를 종료하게 되면 참조 카운트가 0이 됩니다. 그 후 메모리 공간을 다시 해제하도록 하는 것입니다.



unique_ptr


unique_ptr이 shared_ptr과 다른 점은 참조 카운트가 1을 넘을 수 없는 것입니다. 


std::unique_ptr<int> s(new int);
std::unique_ptr<int> t = s;   // 에러 발생
cs


unique_ptr로 할당한 메모리는 하나의 변수로만 가리킬 수 있습니다. 만약 두 군데 이상의 포인터가 하나의 메모리 공간을 가리킨다면 컴파일 에러가 발생하는 것입니다.

반응형

'SW > C++' 카테고리의 다른 글

[ C++ ] array 개념 및 예제  (0) 2018.11.16
[ C++ ] tuple 개념 및 예제  (1) 2018.11.16
[ C++ ] range base for 개념 및 예제  (0) 2018.11.16
[ C++ ] Lambda 개념 및 예제  (0) 2018.11.15
[ c++ ] auto 개념 및 예제  (0) 2018.11.15