2013-06-15 6 views
9

मेरे पास एक सी लाइब्रेरी है जिसे मैं सी ++ पर पोर्ट कर रहा हूं जो मैन्युअल रूप से संदर्भित गिनती वाले structs का भारी उपयोग करता है। मैंने संदर्भ गणना को स्वचालित रूप से संभालने के लिए shared_ptr का उपयोग करने पर विचार किया है, लेकिन मैं सी एपीआई को भी बनाए रखना चाहता हूं।सी इंटरफेस में shared_ptr का उपयोग करना?

Object* object_create(void); 
Object* object_retain(Object* o); 
void object_release(Object* o); 

अगर मैं shared_ptr उपयोग करते हैं, वहाँ किसी भी तरह से प्रभावी रूप से एक सी एपीआई में इस मैनुअल संदर्भ गिनती बेनकाब करने के लिए है: पुराने हस्ताक्षर कुछ इस तरह दिखाई?

+1

बस स्पष्ट करने के लिए; आप 'object_create' से प्राप्त कच्चे सूचक को लपेटने के लिए एक shared_ptr चाहते हैं, और इसे प्रासंगिक समय पर' object_release' कहते हैं? –

+0

@OliCharlesworth नहीं, मैं कर रहा हूँ reimplenting 'Object' सी ++ में एक वर्ग (एक struct के बजाय) के रूप में है, और मैं' shared_ptr' सी ++ कोड के भीतर उपयोग कर रहा हूँ। मुझे दिलचस्पी है यदि किसी साझा_प्टर से कच्चा पॉइंटर प्राप्त करना संभव है और फिर भी इसे साझा_प्टर के रीफॉउंट के साथ काम करना है। –

+2

आप का उपयोग [Boost.intrusive_ptr] (http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/intrusive_ptr.html) से बेहतर हो सकता है। – Angew

उत्तर

5

shared_ptr साथ समस्या यह है, जैसा कि आप पहले से ही पता लगा होगा, कि आप का निर्माण या उदाहरणों को नष्ट करके छोड़कर संदर्भ गिनती संशोधित नहीं कर सकते है। तो नहीं, यह अपने संदर्भ गिनती तक हर निर्माण Object चारों ओर करने के लिए एक shared_ptr रखने के अलावा किसी को काम करने के लिए प्राप्त करने के लिए कोई रास्ता नहीं है शून्य करने के लिए चला जाता है, लेकिन यह सही कर रही है, संदर्भ गिनती के बहुत redoing तो आप बहुत कम लाभ जरूरत पर जोर देता है।

शायद boost::intrusive_ptr एक बेहतर विकल्प है।

1

आप अपने object_create में अपने पॉइंटर के मूल्य को पुनर्प्राप्त करने के लिए std::shared_ptr::get का उपयोग कर सकते हैं।

मुझे यकीन नहीं है कि आपको object_retain या object_release बनाए रखना चाहिए क्योंकि यह पहले ही shared_ptr द्वारा स्वचालित रूप से संभाला गया है।

आप अपने पुस्तकालय सी कोड द्वारा इस्तेमाल किया जा करना चाहते हैं? यदि ऐसा है तो @ एंज्यू ने अपनी टिप्पणी में बताया, Boost.intrusive_ptr पर एक नज़र डालें, यह सबसे अच्छा विकल्प प्रतीत होता है।

आपको लगता है कि ग्राहक सी में लिखे सी पुस्तकालय (लगता है कि जो मैं एक तरह से समझ बनाने) का उपयोग करेगा कोड मान सकते हैं, तो आप पूरी तरह से इन कार्यों ड्रॉप और सभी आंतरिक रूप से संभाल सकते हैं। यदि आपको आवश्यकता है तो आप सी एपीआई के साथ संगतता के लिए कच्चे सूचक प्रदान कर सकते हैं लेकिन सभी जीवनकाल प्रबंधन shared_ptr के साथ स्वचालित रूप से संभाला जा सकता है।

+0

संदर्भ गणना सी पक्ष पर स्वचालित रूप से नहीं रखी जाती है। यदि 'ऑब्जेक्ट' को अंतिम 'shared_ptr' नष्ट कर दिया गया है लेकिन अभी भी' ऑब्जेक्ट * 'इंगित कर रहा है, तो ऑब्जेक्ट नष्ट हो गया है और सी पॉइंटर लटक रहा है। –

+0

सच है, मैं ऑब्जेक्ट के दर्शक के रूप में उपयोग किए जाने वाले कच्चे सूचक के बारे में सोच रहा था, यह मानते हुए कि 'shared_ptr' ऑब्जेक्ट के जीवनकाल को संभाल लेगा। – Uflex

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