Notice
Recent Posts
Recent Comments
공부중
[C++]스마트포인터(Smartpointer) - shared_ptr 본문
반응형
코드는 아래와 같다.
#include <iostream> #include <memory> //shared_ptr , make_shared class MyClass { public: MyClass(int val_int = 0, double val_double = 0.0) : value_int(val_int), value_double(val_double) {}; ~MyClass() {}; private: int value_int; double value_double; }; int main() { /* 가능하다면 메모리 리소스를 처음으로 만들 때 make_shared 함수를 사용하여 shared_ptr을 만들것. make_shared는 예외 안전하고 동일한 호출을 사용하여 제어 블록 및 리소스에대한 메모리를 할당하고 생성 오버헤드가 줄어듭니다. 만일 make_shared를 사용하지 않은 경우 shared_ptr 생성자에 전달하기전에 새 명시적 식에 개체를 만드는데 사용해야 한다. */ std::shared_ptr<MyClass> obj1 = std::make_shared<MyClass>(100, 3.14); auto obj2 = std::make_shared<MyClass>(200, 4.14); std::cout << "obj1.use_count() : " << obj1.use_count() << std::endl; std::shared_ptr<MyClass> obj3 = obj1; std::cout << "obj1.use_count() : " << obj1.use_count() << std::endl; std::cout << "obj3.use_count() : " << obj3.use_count() << std::endl; { std::cout << "==================== local area in ====================" << std::endl; std::shared_ptr<MyClass> localObj = obj3; std::cout << "obj1.use_count() : " << obj1.use_count() << std::endl; std::cout << "obj3.use_count() : " << obj3.use_count() << std::endl; std::cout << "localObj_use_count() : " << localObj.use_count() << std::endl; } std::cout << "==================== local area out ====================" << std::endl; std::cout << "obj1.use_count() : " << obj1.use_count() << std::endl; std::cout << "obj3.use_count() : " << obj3.use_count() << std::endl; return 0; }
실행 결과
이름에서부터 보이다싶이 나 하나만 가져야되는것이 아닌 여러 다른 포인터가 같은 주소를 가리킬수 있는 포인터이다.
흔한 레퍼런스카운팅 방식으로 보이며
위의 코드에서 보이다 싶이 use_count() 메소드를 통해서 얼마나 카운팅 됬는지 확인 가능.
중간에 지역변수로 만들어서 카운트가 올라갔지만 지역을 벗어나 지역변수가 사라지자 카운팅이 내려간것이 보임.
주석에 보이다 싶이 처음 메모리 할당시 make_shared를 이용해서 생성할것을 추천한다고 그러하다.
MSDN에 관련 스마트 포인터 문서가 잘 설명 되어있다. - 링크
make_shared에 관해서는 더 찾아봐야 할듯....
추가로 shared_ptr을 사용하며 메모리 누수(Memory leak)에 관한 내용은 나중에 또 정리를 해야겠다.....
으읔 버그인지 뭔지 모르겠지만 사소한 궁금증이 저 메모리 누수 글을 막고있다 -_-;;
반응형
'Programing > C, C++' 카테고리의 다른 글
[C++] 함수 오버로딩에서 적절한 파라미터를 못찾는다면? (0) | 2018.11.04 |
---|---|
[C++]스마트포인터(Smartpointer) - shared_ptr 메모리 누수(memory leak)에 관련해서 (0) | 2018.05.31 |
[C++]스마트포인터(Smartpointer) - unique_ptr (0) | 2018.05.25 |
[C++]범위 기반 for문(Range-based for loop) (0) | 2018.05.25 |
[C++] 2진수 입력 방법과 어퍼스트로피 (0) | 2018.05.25 |