उस विशेष मामले को रोकने के लिए, आप या तो एक पॉइंटर लेने का विकल्प चुन सकते हैं (क्योंकि 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स्वामित्व लेना चाहिए या तो एक आर-मान के रूप में पास करें और (और पूरी तरह से पॉइंटर / संदर्भ मुद्दों से बचें), या उपयोग करें 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, कम से कम, खोए हुए डेटा को पहचानें)।