क्या खाली और अशक्त शेयर्ड_एप्ट्र के बीच अंतर है?
खाली shared_ptrमें नियंत्रण खंड नहीं है और इसका उपयोग गणना माना जाता है 0. खाली की प्रतिलिपि shared_ptrएक और खाली है shared_ptr। वे दोनों अलग-अलग हैं जो shared_ptrसामान्य नियंत्रण ब्लॉक को साझा नहीं करते हैं क्योंकि उनके पास यह नहीं है। खाली shared_ptrका निर्माण डिफॉल्ट कंस्ट्रक्टर या कंस्ट्रक्टर के साथ किया जा सकता है nullptr।
गैर-रिक्त नल shared_ptrमें नियंत्रण ब्लॉक होता है जिसे अन्य shared_ptrएस के साथ साझा किया जा सकता है । नॉन-खाली नल की कॉपी वह shared_ptrहै shared_ptrजो नियंत्रण ब्लॉक को मूल के रूप में साझा करता है shared_ptrइसलिए उपयोग की संख्या 0. नहीं है। यह कहा जा सकता है कि सभी प्रतियां shared_ptrसमान हैंnullptr । गैर-रिक्त नल shared_ptrका निर्माण ऑब्जेक्ट के प्रकार के शून्य सूचक के साथ किया जा सकता है (नहीं nullptr)
यहाँ उदाहरण है:
#include <iostream>
#include <memory>
int main()
{
std::cout << "std::shared_ptr<int> ptr1:" << std::endl;
{
std::shared_ptr<int> ptr1;
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
std::cout << "std::shared_ptr<int> ptr1(nullptr):" << std::endl;
{
std::shared_ptr<int> ptr1(nullptr);
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
std::cout << "std::shared_ptr<int> ptr1(static_cast<int*>(nullptr))" << std::endl;
{
std::shared_ptr<int> ptr1(static_cast<int*>(nullptr));
std::cout << "\tuse count before copying ptr: " << ptr1.use_count() << std::endl;
std::shared_ptr<int> ptr2 = ptr1;
std::cout << "\tuse count after copying ptr: " << ptr1.use_count() << std::endl;
std::cout << "\tptr1 is " << (ptr1 ? "not null" : "null") << std::endl;
}
std::cout << std::endl;
return 0;
}
यह आउटपुट:
std::shared_ptr<int> ptr1:
use count before copying ptr: 0
use count after copying ptr: 0
ptr1 is null
std::shared_ptr<int> ptr1(nullptr):
use count before copying ptr: 0
use count after copying ptr: 0
ptr1 is null
std::shared_ptr<int> ptr1(static_cast<int*>(nullptr))
use count before copying ptr: 1
use count after copying ptr: 2
ptr1 is null
http://coliru.stacked-crooked.com/a/54f5973090905ed2ff
shared_ptrएक गैर-पूर्ण संग्रहित पॉइंटर के साथ एक खाली उदाहरण के निर्माण की अनुमति देता है ।" पूर्ववर्ती नोट (p15) का उल्लेख करने के लायक भी, "झूलने वाले पॉइंटर की संभावना से बचने के लिए, इस निर्माता के उपयोगकर्ता को यह सुनिश्चित करना होगा किpकम से कम तब तक वैध रहे जब तक कि स्वामित्व समूहrनष्ट न हो जाए।" एक शायद ही कभी इस्तेमाल किया निर्माण।