2012-06-18 7 views
5

मान लीजिए मुझे निम्नलिखित करने की आवश्यकता है (यह सी ++ मानक की चर्चा के लिए केवल कुछ कल्पनाशील कोड है, इस प्रकार मैं चर्चा नहीं करूंगा कि मैं इसे इस तरह क्यों डिजाइन करता हूं, इसलिए मुझे कुछ इस तरह से परेशान न करें: आपका डिज़ाइन गलत है।)वही पता, एकाधिक साझा_प्टर काउंटर, क्या यह C++ मानक द्वारा प्रतिबंधित है?

T* ptr = new T; 
shared_ptr<T> p(ptr); 
shared_ptr<T> q(ptr, SomeDeleterThatDoesnotDeleteButDoSomeOtherStuff()); 

मान लीजिए तर्क गारंटी देता है कि p या उसके प्रतियों की कुछ q की सभी प्रतियों से अधिक समय रहता है, इसलिए व्यावहारिक रूप से कोई समस्या नहीं होगी। मेरा सवाल है, क्या यह सी ++ मानक द्वारा निषिद्ध है, उदा। एक ही पते को साझा करने के लिए अलग साझा_प्टर काउंटरों के लिए स्पष्ट रूप से यूबी के रूप में सी ++ मानक द्वारा कहा गया है?

धन्यवाद।

+1

क्या होगा यदि आप 'वापस क्यू;'? –

+0

@ पीटर मुझे लगता है कि यह विचार है - गैर-डिलीटर का आह्वान करना और ज्ञान के साथ कुछ उपयोगी करना कि संदर्भों का कुछ सबसेट अब खाली है। – Potatoswatter

+0

डिजाइन * इसके * उद्देश्य के लिए भयानक नहीं है। आप उस कस्टम डिलीटर को प्रतिस्थापित करके उचित विनाश की गारंटी दे सकते हैं जो * करता है * हटाता है, और अपने स्वयं के 'shared_ptr'' का स्वामित्व भी करता है। एक डमी ऑब्जेक्ट जो उसके विनाशक में कार्रवाई करता है या 2. एक और कस्टम डिलीटर जो क्रिया करता है । लेकिन उन विधियों को कम कुशलता हो सकती है, यदि 'q' ऑब्जेक्ट्स का सेट उचित मालिकों 'पी' के सेट के सापेक्ष बदलता है। – Potatoswatter

उत्तर

2

मुझे मानक (अच्छी तरह से, अंतिम मसौदा) में कुछ भी नहीं मिल रहा है जो विशेष रूप से इसे नियंत्रित करता है। निकटतम मैं मिल सकता है में 20.9.11.2.10 shared_ptr casts

5 [नोट एक नोट है: उचित रूप में बराबर अभिव्यक्ति shared_ptr (static_cast (r.get())) अंत में अपरिभाषित व्यवहार में परिणाम होगा, एक ही वस्तु को हटाने का प्रयास दो बार। -एंड नोट]

जो वास्तव में एक कस्टम डिलीटर के साथ आपके मामले को भूल जाता है।

5

यदि पहली साझा_प्टर ऑब्जेक्ट नष्ट हो जाती है, तो आपको यूबी मिलती है क्योंकि दूसरे का उपयोग करने वाली ऑब्जेक्ट रिलीज ऑब्जेक्ट तक पहुंच सकती है।

चूंकि आपने यह सुनिश्चित किया है कि आपकी पहली साझा_प्टर ऑब्जेक्ट अधिक समय तक रहती है, तो आपको यूबी नहीं मिलता है।

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