2017-05-23 11 views
10

निम्नलिखित कोड का टुकड़ा के लिए, यह तरीकों में अलग संदर्भ में गिना जाता है पता चलता है। क्या कोई समझा सकता है कि ये मान अलग क्यों हैं?क्यों स्थिरांक shared_ptr <const T> और और स्थिरांक shared_ptr <T> और दिखाने के अलग संदर्भ में गिना जाता है क्या ज़रूरत है?

class Foo { 
}; 

void f1(const std::shared_ptr<Foo>& ptr) { 
    std::cout << "f1(): counts: " << ptr.use_count() << std::endl; 
} 

void f2(const std::shared_ptr<const Foo>& ptr) { 
    std::cout << "f2(): counts: " << ptr.use_count() << std::endl; 
} 

int main() { 
    std::shared_ptr<Foo> ptr(new Foo); 
    std::cout << "main(): counts: " << ptr.use_count() << std::endl; 

    f1(ptr); 
    f2(ptr); 

    std::cout << "main(): counts: " << ptr.use_count() << std::endl; 

    return 0; 
} 

इसी उत्पादन:

main(): counts: 1 
f1(): counts: 1 
f2(): counts: 2 
main(): counts: 1 
+2

ऐसा नहीं है कि f2 कॉल shared_ptr से परिवर्तित shared_ptr करने के भाग के रूप एक अंतर्निहित अस्थायी वस्तु का निर्माण करने के लिए किया था की संभावना है, और वह यह है कि जहां दूसरे refcount जब f2 निष्पादित हो रहा है से आ रही है। –

+0

धन्यवाद! सही बात। –

+5

बिल्कुल संबंधित नहीं हैं, बस FYI करें: आप [का उपयोग '' new' के बजाय make_shared'] चाहिए (https://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/) – Tas

उत्तर

11

ध्यान दें कि std::shared_ptr<Foo> और std::shared_ptr<const Foo> विभिन्न प्रकार हैं (विभिन्न टेम्पलेट प्रकार तर्क के साथ अर्थात वर्ग टेम्पलेट instantiations विभिन्न प्रकार हैं)।

जब आप पारित ptr (अर्थात एक std::shared_ptr<Foo>) f2, यह std::shared_ptr<const Foo> सीधे करने के लिए संदर्भ के लिए बाध्य नहीं किया जा सकता; एक अस्थायी std::shared_ptr<const Foo> का निर्माण किया जाना चाहिए और उसके बाद पैरामीटर ptr पर बाध्य होना चाहिए। मूल shared_ptr निर्माण के साथ shared_ptr शेयरों स्वामित्व है, तो use_count f2() में 2 तक बढ़ जाती है।

अस्थायी नष्ट हो जाएगा जब f2(ptr); समाप्त हो जाती है; तो use_count 1 में कमी आई है।

+0

मैं 'के लिए std :: shared_ptr ptr (नई फू) प्रारंभ बदल है,' और 'f2 (PTR)' कहा जाता है। अब मैं देख सकता हूं कि refcount वृद्धि नहीं हुई है। बहुत सराहना की! –

+0

@ArupRatonRoy हाँ, इस मामले के लिए कोई अस्थायी परेशानी नहीं करता है। – songyuanyao

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