2013-05-26 5 views
15

शीर्षक में। इस प्रश्न में शायद पहले से ही एक जवाब है लेकिन मैं एक खोजने में विफल रहा।कच्चे सूचक और weak_ptr के बीच क्या अंतर है?

+7

तुम कुछ वैध करने के लिए अगर एक weak_ptr अंक देख सकते हैं। आप कच्चे सूचक के साथ ऐसा नहीं कर सकते हैं। – juanchopanza

+1

यह शायद बेहतर अगर आप [यहां] (http://en.cppreference.com/w/cpp/memory/weak_ptr) देखने के लिए और सभी मतभेदों को खुद देखते हैं। कोई भी अंतर नहीं है, बहुत सारे हैं। – juanchopanza

उत्तर

16

एक नग्न संकेतक और एक weak_ptr के बीच मौलिक वैचारिक अंतर यह है कि अगर वस्तु नष्ट हो जाता है की ओर इशारा किया, नग्न सूचक इसके बारे में आपको बता नहीं जाएगा। इसे एक लटकते पॉइंटर कहा जाता है: किसी ऑब्जेक्ट के लिए पॉइंटर जो मौजूद नहीं है। वे आमतौर पर ट्रैक करने के लिए मुश्किल हैं।

weak_ptr होगा। आदेश में एक weak_ptr का उपयोग करने के लिए, आपको पहले यह एक shared_ptr में परिवर्तित करना होगा। और यदि shared_ptr कुछ भी इंगित नहीं करता है, तो ऑब्जेक्ट हटा दिया गया था।

उदाहरण के लिए:

#include <iostream> 
#include <memory> 

std::weak_ptr<int> wp; 

void test() 
{ 
    auto spt = wp.lock(); // Has to be copied into a shared_ptr before usage 
    if (spt) { 
     std::cout << *spt << "\n"; 
    } else { 
     std::cout << "wp is expired\n"; 
    } 
} 

int main() 
{ 
    { 
     auto sp = std::make_shared<int>(42); 
     wp = sp; 
     test(); 
    } 
    test(); 
} 

आउटपुट

42 
wp is expired 
17

एक कच्चा सूचक (कम से कम सामान्यतः) केवल एक पता है। आप पॉइंटर से पर पर जो कुछ भी इंगित करते हैं, उसके बारे में कुछ भी नहीं बता सकते हैं।

एक weak_ptr हमेशा एक shared_ptr साथ जुड़ा हुआ है, तो हम शायद एक shared_ptr के साथ शुरू करने के लिए एक weak_ptr का कोई मतलब की जरूरत है।

shared_ptr संदर्भ गिना जाता है, इसलिए यह किसी ऑब्जेक्ट में कितने संदर्भ (पॉइंटर्स) मौजूद है, इसका ट्रैक रखता है, और ऑब्जेक्ट को स्वचालित रूप से नष्ट कर देता है जब उस ऑब्जेक्ट का कोई और संदर्भ मौजूद नहीं होता है।

जैसा कि मैंने पहले ही कहा है, weak_ptrshared_ptr से जुड़ा हुआ है। shared_ptr के विपरीत, weak_ptr का अस्तित्व पॉइंट ऑब्जेक्ट के लिए संदर्भ गणना को बढ़ाता है। weak_ptr का उपयोग करने के लिए, आपको पहले इसे shared_ptr में परिवर्तित करना होगा। यदि वर्तमान संदर्भ गिनती सकारात्मक है, कि सफल होगा, औरweak_ptr एक shared_ptr को बदलने संदर्भ संख्या में भी वृद्धि दर्शाता है कि परिवर्तित सूचक वस्तु के लिए एक 'असली' संदर्भ है जाएगा। यदि, दूसरी ओर, संदर्भ गणना पहले से ही शून्य है (जिसका मतलब है कि पॉइंटी ऑब्जेक्ट पहले ही नष्ट हो चुका है)को shared_ptr में कनवर्ट करने का प्रयास बस असफल हो जाएगा।

shared_ptr का मतलब पॉइंट ऑब्जेक्ट का साझा स्वामित्व है। pointee वस्तु के रूप में लंबे समय तक अस्तित्व में रहने के रूप में उस वस्तु को कम से कम एक shared_ptr मौजूद है, लेकिन जैसे ही पिछले shared_ptr वस्तु को नष्ट कर दिया है, इसलिए pointee वस्तु होगा होगा।

weak_ptr का मतलब पॉइंट ऑब्जेक्ट तक पहुंच रहित नहीं है। ऑब्जेक्ट मौजूद होने पर यह एक्सेस की अनुमति देता है। यदि वस्तु नष्ट हो गई है, तो यह आपको बताती है कि नष्ट वस्तु का उपयोग करने के बजाय पॉइंट ऑब्जेक्ट अब मौजूद नहीं है।

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