2012-07-01 12 views
12
class MyClass { 
public: 
    MyClass(std::weak_ptr<MyClass> parent){} 
} 

मैं ऐसा करना चाहते हैं:मैं क्यों weak_ptr को nullptr डाली नहीं कर सकता <>

auto newInstance = std::make_shared<MyClass>(nullptr); 

या weak_ptr तर्क का डिफ़ॉल्ट मान रिक्त है, जैसे:

void function(int arg,std::weak_ptr<MyClass> obj = nullptr); 

लेकिन , मुझे इसके बजाय क्या करना है:

auto newInstance = std::make_shared<MyClass>(std::shared_ptr<MyClass>(nullptr)); 

वह क्यों है?

+0

बीटीडब्ल्यू, अगली बार, आपके प्रश्न में संकलक त्रुटियों को भी शामिल करता है – akappa

उत्तर

23

क्योंकि अवधारणा में weak_ptr केवल weak_ptr या shared_ptr से बनाया जा सकता है। यह कच्चे सूचक से निर्माण करने के लिए समझ में नहीं आता है, चाहे वह nullptr है या नहीं।

आप एक डिफ़ॉल्ट का निर्माण weak_ptr (std::weak_ptr<MyClass>()) का उपयोग कर सकते हैं जहाँ आप nullptr उपयोग करने के लिए कोशिश कर रहे हैं:

auto newInstance = std::make_shared<MyClass>(std::weak_ptr<MyClass>()); 
void function(int arg,std::weak_ptr<MyClass> obj = std::weak_ptr<MyClass>()); 
+1

'nullptr' में विशेष प्रकार 'nullptr_t' है इसलिए कच्चे पॉइंटर्स को पूरी तरह से' nullptr_t' में परिवर्तित नहीं किया जा सकता है। इसलिए मुझे 'weak_ptr (nullptr)' पर प्रतिबंध लगाने के किसी भी कारण नहीं दिख रहे हैं। – magras

+0

@ मैग्रास मैंने इस जवाब को कई साल पहले लिखा था, और टीबी मैं आपके साथ सहमत हूं। मूल रूप से यह समझ में आता है कि एक कमजोर सूचक को या तो साझा_प्टर या असंबद्ध से जोड़ा जाना चाहिए। मानक समिति ने स्पष्ट रूप से निर्णय लिया कि नलप्टर ने असंबद्ध और डिफ़ॉल्ट रूप से निर्मित नहीं किया। – David

-1

एक कमजोर सूचक का प्राथमिक उद्देश्य पता करने के लिए एक वस्तु है कि अन्य कोड से नष्ट किया जा सकता है अभी भी मौजूद है कि क्या आम तौर पर है । एक सामान्य सूचक से निर्मित एक कमजोर सूचक कैसे संभवतः पता कर सकता है कि वस्तु अभी भी मौजूद है या नहीं? क्या आप कल्पना भी कर सकते हैं कि यह संभवतः काम कर सकता है?

+4

मैं कल्पना कर सकता हूं कि, मुझे लगता है। काफी आसानी से। :) – Kos

+0

"एक कमजोर सूचक का एकमात्र उद्देश्य यह जानना है कि किसी ऑब्जेक्ट को अन्य कोड द्वारा नष्ट किया जा सकता है या नहीं," थोड़ा उलझन में है। मैं कहूंगा कि यह weak_ptr की सुविधा है। स्मार्ट पॉइंटर्स का उद्देश्य स्मृति प्रबंधन को स्वचालित करना है। इसके अलावा कमजोर_प्टर की कुछ और सुविधाएं हैं: (1) जैसा कि आपने कहा है कि इसके जीवनकाल पर प्रभाव के बिना ऑब्जेक्ट को देखकर (2) तथाकथित "चक्र बनाए रखें" को रोकें (जब ऑब्जेक्ट्स का सर्कल एक दूसरे के साथ साझा पॉइंटर के साथ संदर्भित करता है, इस प्रकार सभी को रखते हुए वस्तुओं को जिंदा और मेमोरी लीक का कारण बनता है) (3) shared_ptr लौटने वाली पॉइंट ऑब्जेक्ट को संदर्भित कर सकता है। –

+1

जब आप कमजोर_प्टर को कन्स्ट्रक्टर में नलप्टर के लिए स्वत: निर्मित करना चाहते हैं तो कैसे? वह तब होता है जब मुझे इस कार्यक्षमता की आवश्यकता होती है। – Andrew

संबंधित मुद्दे