1. 클래스 변수로 사용할 때 한 클래스에서만 스마트포인터로 정의하고
함수 인자 넘길때는 get() 함수 이용해서 raw 포인터로 씀
2. const 스맛포인터 레퍼런스로 넘김
3. move로 옮기면서 넘겼다가 리턴할때 다시 돌려받기
요셋중 하나같은데 사람들이 많이 쓰거나 바람직하다고 하는 방법이 뭐임 보통?
글고 2번 경우에 unique_ptr 로 저장한 원래 클래스A 이외에 타클래스B에서도 포인터를
멤버로 갖게 하고 그 포인터 초기화하고 싶을땐 소유권 이전시키면 되는거임? 어차피 유닠포이너는
복사나 대입이 안되니까 원래 개념대로면 쉐어포인터쓰는게 맞는거 같기도 한데 걔는 걍 근들기가 싫음
class myclass
{
...
}
class A
{
unique_ptr<myclass> au=make_unique<myclass>();
B *b;
void init()
{
b.init(au);
}
}
class B
{
unique_ptr<myclass> bu;
void init(unique_ptr<myclass> p)
{
bu.reset(p.release());
}
}
이런식으로 하면되는건가 아님 move 로 옮기거나
1 난
그게 가장편하긴하더라 딴클래스에서 멤버로 넣을떄도 걍 포인터로 퉁치면되고 ㅋㅋ
1번
국룰 : 주는 쪽에서 생성하거나, 받는 쪽에서 해제해야 하는 두 가지 경우를 제외하고는 스마트 포인터를 아예 넘기지 마셈. 무조건 .get()한 raw 포인터를 넘기셈
그러네 참조 인자자체는 소유권이 어떻게 된다기엔 애매하지만 두개 이상클래스에서 포인터변수가 같이 있으면 쩔수없이 소유권 넘어가고 make시킨 클래스외에서 소멸되버리면 뭔가 구질구질하고 저런경우에는 걍 공유포인터쓰는게 맞는거같다
근데 어차피 개인 프로젝트 수준에선 share_ptr 쓰는거자체가 오바고 걍 raw로 넘기는게 젤무난하네
Shared ptr 막 넘기고 받다보면 어디서 해제될지 알수가 없기 때문에 추적하기 매우 좃같아짐 그냥 객체생애주기가 제일 긴 놈을 factory로 둬서 걔가 할당, 해제 모든 책이 갖도록 하면 됨
책임 ㅇ
국룰 2 : 멀티스레딩 쓰는 경우가 아니라면 shared ptr 쓰지 말것
두번째 질문에 대해선 한쪽이 raw 포인터를 갖게 하면 됨
외부에 api로 제공하는 인터페이스를 제외하고는 raw포인터로 쓰는게 맞음 - dc App
shared_ptr은 잠깐 함수 인자로 넘겨줄라고 쓰는 게 아니기 때문에 니가 생각한 게 맞음. 트리형 자료구조 같은 특수한 경우에만 사용하셈 그리고 원래는 아예 포인터가 아니라 const reference로 받고 그걸 호출하는 쪽에서 신경 쓰는 게 국룰임. nullptr은 애초에 안 담는 게 좋고
근데 1로 하면 다른 애들이 가지고 있는 raw ptr validation은 아무것도 없는 거 아님??