मुक्त नहीं किया जाना चाहिए वर्तमान में मैं ग्लिब लाइब्रेरी से कुछ फ़ंक्शंस का उपयोग कर रहा हूं। ग्लिब के साथ भी जीओ आता है। ग्लिब एक सी लाइब्रेरी है और इसलिए मुझे कुछ संरचनाएं हटाने की ज़रूरत है जो मैं बनाता हूं।एक साझाकर्ता के साथ एक पॉइंटर के साथ share_ptr का उपयोग कैसे करें जिसे
वस्तुओं मैं बनाने के एक smartpointer जैसे से कई के लिए:
std::shared_ptr<GAsyncQueue> my_queue = std::shared_ptr<GAsyncQueue>(g_async_queue_create(), g_async_queue_unref);
इसके लिए एक GAsyncQueue
करने के लिए एक साझा सूचक बनाता है और यह सुरक्षित रूप से अपने जीवन के अपने अंत पर कतार नष्ट कर देता है है।
हालांकि, मुझे समस्या है जब मैं जीओ लाइब्रेरी से एक पॉइंटर प्राप्त करता हूं जिसे मुझे मुक्त नहीं करना चाहिए। निम्नलिखित कोड my_connection
में एक GSocketClient wich उपकरण (ग्लिब बोलने में) GIOStream है।
std::shared_ptr<GInputStream> my_input_stream =
std::shared_ptr<GInputStream> (
g_io_stream_get_input_stream(G_IO_STREAM(my_connection.get()))
);
क्योंकि GIOStream पर दस्तावेजीकरण का उल्लेख है, कि सूचक g_io_stream_get_input_stream()
के साथ प्राप्त मुक्त नहीं किया जाना चाहिए। ऐसा इसलिए है क्योंकि यह my_connection
उदाहरण के स्वामित्व में है। मैंने नष्ट ऑब्जेक्ट के लिए लैम्डा बनाने के बारे में सोचा, साझा पॉइंटर ऑब्जेक्ट का दूसरा पैरामीटर। उदाहरण के लिए auto deleter = [](GInputStream* ptr) {};
और उसके बाद उस लैम्ब्डा को साझा पॉइंटर पर फ़ंक्शन फेंक दें, लेकिन यह एक प्रकार का बेवकूफ लगता है।
क्यों एक (स्मार्ट) पॉइंटर का उपयोग करें? एक संदर्भ पर्याप्त नहीं होगा? – edmz
@black मैं अभी भी इसके बारे में थोड़ा चिंतित हूं। इनपुट स्ट्रीम एक ऑब्जेक्ट का एक उदाहरण है जो कॉपी हो जाता है। आखिरी प्रति विनाशक कहलाता है जब GIOStream नष्ट हो जाता है। शायद चूंकि मुझे इसे नष्ट करने की ज़रूरत नहीं है, वैसे भी एक सादा पुराना सूचक भी ठीक है ... – hetepeperfan
और एक पॉइंटर मैं नल पर सेट कर सकता हूं, फिर यह देखना आसान है कि यह प्रारंभ किया गया है या नहीं। – hetepeperfan