이러한 특정 상황을 방지하기 위해 포인터를 사용하거나 ( Weep(&std::vector<int>{1,2,3})허용되지 않기 때문에) 상수가 아닌 참조를 사용하여 일시적으로 오류가 발생할 수 있습니다.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
이것들은 여전히 값이 유효하다는 것을 보장하지는 않지만 최소한 가장 쉬운 실수를 멈추고 사본을 만들지 않으며 nums특별한 방법으로 만들 필요가 없습니다 (예 : std::shared_ptr또는 std::weak_ptr수행).
std::scoped_lock뮤텍스에 대한 참조를 취하는 것은 하나의 예일 수 있으며 고유 / 공유 / 약한 ptr이 실제로 원하지 않는 경우입니다. 종종 std::mutex기본 멤버 또는 로컬 변수 일뿐입니다. 여전히 매우 조심해야하지만 이러한 경우 수명을 결정하는 것이 일반적으로 쉽습니다.
std::weak_ptr비 소유를위한 또 다른 옵션이지만 호출자가 강제로 사용하도록 shared_ptr(따라서 힙 할당) 강제로 원하지 않는 경우도 있습니다.
사본이 정상이면 문제를 피할 수 있습니다.
경우 Woop소유권을 어느 쪽 r 값과 이동 (그리고 피할 포인터 / 참조 문제 전체) 또는 사용으로 전달해야 unique_ptr당신이 유효 포인터를 값 자체를 이동하거나 할 수없는 경우.
// the caller can't continue to use nums, they could however get `numbers` from Woop or such like
// or just let Woop only manipulate numbers directly.
Woop(std::vector<int> &&nums)
: numbers(std::move(nums)) {}
std::vector<int> numbers;
// while the caller looses the unique_ptr, they might still use a raw pointer, but be careful.
// Or again access numbers only via Woop as with the move construct above.
Woop(std::unique_ptr<std::vector<int>> &&nums)
: numbers(std::move(nums)) {}
std::unique_ptr<std::vector<int>> numbers;
또는 소유권이 공유되면 shared_ptr모든 것에 사용할 수 있으며 최종 참조와 함께 삭제되지만 과도하게 사용되는 경우 객체 수명주기를 추적하는 것이 매우 혼란 스러울 수 있습니다.
std::unique_ptr으로 (독점 소유권std::shared_ptr또는 공유 소유권std::weak_ptr을 위해 또는 적어도 손실 된 데이터를 인식하기 위해) 이 데이터를 모델링하는 것이 좋습니다.