मेरी noob प्रतिष्ठा की वजह से, मैं, इस Thread का उत्तर दे सकते नहीं विशिष्ट स्वीकार किए जाते हैं जवाब में:कोई संदर्भ नहीं होने पर कैश से (गैर-घुसपैठ) स्मार्ट पॉइंटर्स को कैसे हटाया जाए?
मैं बढ़ावा :: घुसपैठ स्मार्ट संकेत इस्तेमाल कभी नहीं किया है, लेकिन अगर आप shared_ptr स्मार्ट संकेत का प्रयोग करेंगे, तो आप weak_ptr इस्तेमाल कर सकते हैं आपके कैश के लिए वस्तुओं।
उन कमजोर_प्टर पॉइंटर्स संदर्भ के रूप में गिनती नहीं करते हैं जब सिस्टम उनकी याददाश्त को मुक्त करने का निर्णय लेता है, लेकिन जब तक ऑब्जेक्ट अभी तक नहीं हटाया जाता है तब तक एक साझा_ptr को पुनर्प्राप्त करने के लिए उपयोग किया जा सकता है।
यह निश्चित रूप से एक सहज विचार है, हालांकि, सी ++ मानक कमजोर_प्टर्स की तुलना का समर्थन नहीं करता है, इसलिए इसे सहयोगी कंटेनरों के लिए कुंजी के रूप में उपयोग नहीं किया जा सकता है। यह weak_ptrs के लिए एक तुलना ऑपरेटर को लागू करने से उन्हें धोखा दिया जा सकता है:
template<class Ty1, class Ty2>
bool operator<(
const weak_ptr<Ty1>& _Left,
const weak_ptr<Ty2>& _Right
);
इस समाधान के साथ समस्या यह है कि
(1) तुलना ऑपरेटर (हर तुलना के लिए स्वामित्व प्राप्त करने के लिए है यानी weak_ptr से बनाने shared_ptrs रेफरी)
(2) कमजोर_प्टर कैश से मिटा नहीं जाता है जब संसाधन का प्रबंधन करने वाले अंतिम साझा_प्टर को नष्ट कर दिया जाता है, लेकिन कैश में एक समाप्त हो गया कमजोर_प्टर रखा जाता है।
के लिए (2), हम एक कस्टम विनाशक (DeleteThread) प्रदान कर सकते हैं, हालांकि, इसे हटाने के लिए टी * से कमजोर_प्टर बनाने की आवश्यकता होगी, जिसे कैश से कमजोर_प्टर को मिटाने के लिए उपयोग किया जा सकता है ।
मेरा प्रश्न यह होगा कि स्मार्ट पॉइंटर्स का उपयोग करके कैश के लिए कोई बेहतर तरीका है (मैं वीसी 100 कंपाइलर का उपयोग कर रहा हूं, कोई बढ़ावा नहीं देता), या क्या मुझे बस यह नहीं मिलता है?
चीयर्स, डैनियल
आप नहीं कर सकते हैं किसी भी कुंजी-आधारित कंटेनर की कुंजी बदलें !!! यह अपरिवर्तनीय होना चाहिए! आपके पास कुछ कस्टम डिलीट-द-आखिरी हो सकता है जो आपके कंटेनर से प्रविष्टि तक पहुंचता है और हटा देता है। लेकिन कंटेनर में एक महत्वपूर्ण परिवर्तन मूल्य होने पर एक बड़ा नंबर नहीं है। – Mordachai
यह बिल्कुल समस्या है, मुझे एक कस्टम डिलीटर प्रदान करना होगा जो कैश में ऑब्जेक्ट को मिटा देता है ताकि कैश में समाप्त होने वाले पॉइंटर से बच सकें। या आप आम तौर पर बात कर रहे हैं, क्योंकि रेफ-गिनती बदल रही है? – dwn