Monday 15 March 2010

c++ - Detach a pointer from a shared_ptr? -


संभव डुप्लिकेट:

मेरे इंटरफ़ेस का एक फ़ंक्शन ऑब्जेक्ट के लिए एक सूचक देता है। उपयोगकर्ता को उस ऑब्जेक्ट के स्वामित्व लेना माना जाता है। मैं बूस्ट को वापस नहीं करना चाहता। शेयर्ड_पीट्रर, क्योंकि मैं ग्राहकों को बढ़ावा देने के लिए मजबूर नहीं करना चाहता हूं। आंतरिक रूप से हालांकि, मैं अपवाद के मामले में मेमोरी लीक को रोकने के लिए एक साझा आईपीटीआर में सूचक को संचित करना चाहूंगा। एक साझा सूचक से सूचक को अलग करने का कोई रास्ता नहीं है। कोई भी विचार यहां है?

आप जो खोज रहे हैं वह एक रिहाई फ़ंक्शन है ; shared_ptr में एक रिलीज़ फ़ंक्शन नहीं है। :

क्यू क्यों साझा नहीं किया गया एक साझा रिलीज़ () फ़ंक्शन?

ए Share_ptr स्वामित्व को तब तक नहीं दे सकता जब तक कि यह अनूठा () न हो, क्योंकि अन्य प्रतिलिपि अब भी वस्तु को नष्ट कर देगी।

विचार करें:

  shared_ptr & lt; int & gt; एक (नया इंट); shared_ptr & LT; पूर्णांक & gt; बी ० ए); // a.use_count () == b.use_count () == 2 int * p = a.release (); // अब कौन पी मालिक है? बी अभी भी अपने डिस्ट्रिक्ट में उस पर डिलीट करेगा।  

इसके अलावा, रिटर्न () से लौटा संकेतक भरोसेमंद ढंग से डीलोक करना मुश्किल होगा, क्योंकि स्रोत shared_ptr कस्टम डिलीवर के साथ बनाया जा सकता था।

दो विकल्प जिन पर आप विचार कर सकते हैं:

  • आप std :: tr1 :: shared_ptr का उपयोग कर सकते हैं, जिससे आपके उपयोगकर्ताओं को सी ++ लाइब्रेरी कार्यान्वयन का समर्थन करने की आवश्यकता होगी TR1 या बूस्ट का उपयोग करने के लिए; कम से कम यह उन्हें दो के बीच का विकल्प देगा।
  • आप अपना खुद का boost :: shared_ptr - साझा साझा सूचक लागू कर सकते हैं और अपने बाह्य इंटरफेस पर इसका उपयोग कर सकते हैं।

आप इस प्रश्न के बारे में भी चर्चा कर सकते हैं।


No comments:

Post a Comment