Bu özel durumu önlemek için, bir işaretçi almayı seçebilirsiniz ( Weep(&std::vector<int>{1,2,3})izin verilmediği için) veya geçici olarak hata verecek sabit olmayan bir başvuru alabilirsiniz.
Woop(const std::vector<int> *nums);
Woop(std::vector<int> *nums);
Woop(std::vector<int>& nums);
Bunlar hala değerin geçerli kalmasını garanti etmez, ancak en kolay hatayı durdurur, kopya oluşturmaz ve numsözel bir şekilde (örneğin std::shared_ptrveya olduğu std::weak_ptrgibi) oluşturulmasına gerek yoktur.
std::scoped_lockmuteksi referans almak bir örnek ve benzersiz / paylaşılan / zayıf ptr'nin gerçekten istenmediği bir örnek olacaktır. Genellikle std::mutexsadece temel bir üye veya yerel değişken olacaktır. Yine de çok dikkatli olmalısınız, ancak bu durumlarda yaşam süresini belirlemek genellikle kolaydır.
std::weak_ptrsahip shared_ptrolmama için başka bir seçenektir, ancak daha sonra arayanı kullanmaya zorlarsınız (ve böylece yığın ayırmayı) ve bazen bu istenmez.
Bir kopya uygunsa, bu sadece sorunu önler.
Eğer Woopsahipliğini almak ya r değeri ve taşımak (ve önlemek pointer / referans sorunları tamamen) veya kullanımı gibi geçmelidir unique_ptrEğer geçerli kalmasını işaretçi değerini kendisi taşımak veya istemiyor eğer.
// 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;
Veya sahiplik paylaşılıyorsa, shared_ptrher şey için kullanabilirsiniz ve son referansla birlikte silinir, ancak bu, aşırı kullanım durumunda nesne yaşam döngülerini takip etmeyi çok kafa karıştırıcı hale getirebilir.
std::unique_ptrmünhasır sahiplikstd::shared_ptrveya paylaşılan sahiplik için veyastd::weak_ptren azından kayıp verileri tanımak için) modellemeyi düşünürüm .