เพื่อป้องกันกรณีดังกล่าวคุณสามารถเลือกที่จะใช้พอยน์เตอร์ (เนื่องจาก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การอ้างอิงถึง mutex จะเป็นตัวอย่างและอีกอันที่ไม่ต้องการ 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เพื่ออย่างน้อยรับรู้ข้อมูลที่หายไป)