본문 바로가기

프로그래밍/C/C++

c++ 11, 14 shared_ptr

자원관리!! 

shared_ptr 공유포인터!!

생성자->ref 증가

소멸자 ->ref 감소

복사배정->증가 감소

이동생성 -> shared_ptr를 이동해서 새로운 shared_ptr에 생성하면 기존 shared_ptr은 nullptr이 된다. (복사즐)

커스텀삭제자 지원은 unique_ptr과 동일하다. (커스텀삭제자 이용해도 객체 크기는 그대로)


shared_ptr -> 

1. 생포인터의 두배이다

2. 동적할당해야한다 (참조횟수때문에)


커스텀삭제자->

std::shared_ptr<widget> spw(new widget, customDel); // unique_ptr과좀다름


make_shared -> 항상 제어 블록 생성



헬 예제 1.

생포인터로 shared_ptr 생성자 바로 호출하면 제어블록 생성된다

그말인즉슨......아래 예제를 봐라

auto ptr = new widget;

shared_ptr<widget> sptr1(ptr, customDel);

shared_ptr<widget> sptr2(ptr, customDel);

----- 제어블록 두개 생성됨!! ㅠㅠ 헬이다 ㄷㄹㅇ 죽여야해!크앜


★꼭 생포인터로 전달할거면 아래처럼 해라. 변수 남겨서 다른곳에서도 제어블록 여러개 생성되면 헬임.★

shared_ptr<widget> sptr3(new widget, customDel);

★이 실수 제일 많이 발생 할 수 있음. 찾기도 힘들거같음 ㅡㅡ 조심조심조심-뼈에새겨라 라이브에서 이러면 수명 갉아먹는다-_-이사님소환스킬이다★






헬 예제 2.

vector<shared_ptr<widget>> vec;


widget::process()

{

vec.emplace_back(this); //헉!!!!!!!!!! 제어블록이 또 만들어진다

}


★해결방법★

enable_shared_from_this 을 사용하면 됨 (뭔가 길어서 안이쁘지만 그래도...)

class widget : public enable_shared_from_this<widget>

{}


여튼 저렇게 상속 받으면

widget는 shared_from_this를 갖게 된다.

다시 시도해보자

widget::process()

{

vec.emplace_back(shared_from_this()); //ㅇㅇ굿쟙

}



'프로그래밍 > C/C++' 카테고리의 다른 글

c++11 move, forward  (0) 2017.06.13
c++11, 14 weak_ptr  (0) 2017.06.13
c++ 11, 14 unique_ptr  (0) 2017.06.13
c++ 11, 14  (0) 2017.06.13
c++ 11, 14 for, auto  (0) 2016.08.07