해결된 질문
작성
·
19
1
17분 경 유니크 포인터 안의 리소스 포인터를 함수매개변수로 받아주는데 포인터로 받는것도 결국은 복사되는 것 아닌가요? 유니크 포인터가 아닌 포인터로 받아서 카피 시멘틱스가 작동해도 상관이 없는 건가요? 헷갈려서 질문드립니다.
답변 1
0
안녕하세요? 질문&답변 도우미 durams입니다.
아마 아래 부분에 대해서 질문해주신 것 같습니다.
void doSomething2(Resource* res)
{
res->setAll(100);
res->print():
}
말씀하신 대로 이런 식으로 작성하게되면 포인터가 복사됩니다. 위 함수가 작동하는 동안에는 '객체에 대한 소유권을 여러 곳에서 가진다' 라고 말할 수 있겠죠.
이는 강의에서 제시한 스마트 포인터 사용 시 함수에서 인자를 전달받을 수 있는 주요한 세 가지 방법 중 하나입니다.
std::move
를 통해 함수에게 소유권을 주고, 다시 돌려받기
l-value reference를 전달하여 함수 내에서 참조를 통해 작업하기
스마트 포인터 내 객체의 포인터를 직접적으로 전달하기
(위 코드)
1번의 경우 함수 동작에 따라 소유권을 주고 돌려받지 않을 수도 있습니다. 실제로 소유권이 여러 곳을 이동하는 경우 쓰면 좋겠죠.
2번은 소유권의 이동이 필요 없는 상태에서 해당 객체를 통해 작업하고 싶은 경우가 되겠습니다.
3번은 사실 권장되지 않는 방식이라고 말씀드리고 싶습니다. 엄격한 소유권 관리를 위해 std::unique_ptr
을 도입을 하더라도 정작 함수에 raw pointer를 전달하면 std::unique_ptr
가 관리하는 소유권과 별개로 객체에 접근 가능한 '비인가된 우회로'가 생기는 것과 같습니다. 그러니 잠재적인 문제가 발생할 수도 있는 방식입니다. 물론 문법적으로는 허용됩니다.
직접 사용해보시면서 일부러 문제를 발생시켜보는 것도 좋은 연습이 되실 듯 합니다.