자원관리!!
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 |