क्या खाली और अशक्त शेयर्ड_एप्ट्र के बीच अंतर है?
खाली 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
नष्ट न हो जाए।" एक शायद ही कभी इस्तेमाल किया निर्माण।