Qt
बाँटने का काम
खोज…
टिप्पणियों
Qt कंटेनर पर एसटीएल शैली के पुनरावृत्तियाँ निहित-साझाकरण के कारण कुछ नकारात्मक दुष्प्रभाव हो सकते हैं। यह सलाह दी जाती है कि जब आप पुनरावृत्तियों पर सक्रिय हों, तो Qt कंटेनर की प्रतिलिपि बनाने से बचें।
QVector<int> a,b; //2 vectors
a.resize(1000);
b = a; // b and a now point to the same memory internally
auto iter = a.begin(); //iter also points to the same memory a and b do
a[4] = 1; //a creates a new copy and points to different memory.
//Warning 1: b and iter point sill to the same even if iter was "a.begin()"
b.clear(); //delete b-memory
//Warning 2: iter only holds a pointer to the memory but does not increase ref-count.
// so now the memory iter points to is invalid. UB!
मूल अवधारणा
कई क्यूटी ऑब्जेक्ट और कंटेनर एक अवधारणा कॉल का उपयोग करते हैं , जो साझाकरण को कहते हैं , जिसे कॉपी-ऑन-राइट के रूप में भी संदर्भित किया जा सकता है।
इम्प्लिक्ट शेयरिंग का अर्थ है कि जो वर्ग इस अवधारणा का उपयोग करते हैं, वे आरंभिक आंकड़ों पर समान डेटा साझा करते हैं।
अवधारणा का उपयोग करने के लिए इन वर्गों में से एक QString है।
QString s1("Hello World");
यह एक QString का सरलीकृत मॉडल है। आंतरिक रूप से इसमें एक मेमोरी ब्लॉक होता है, जिसमें वास्तविक स्ट्रिंग डेटा और एक संदर्भ काउंटर होता है।
QString s2 = s1;
यदि हम अब इस QString
कॉपी करते हैं, तो दोनों ऑब्जेक्ट आंतरिक रूप से एक ही सामग्री को इंगित करेंगे, इस प्रकार अनावश्यक कॉपी ऑपरेशन से बचेंगे। ध्यान दें कि संदर्भ संख्या भी कैसे उठी। इसलिए यदि पहला स्ट्रिंग साझा किए गए डेटा को हटा दिया जाता है, तब भी पता चलता है कि यह किसी अन्य QString
द्वारा संदर्भित है।
s2 += " and all the other Worlds!"
अब जब QString
को वास्तव में मेमोरी ब्लॉक से ऑब्जेक्ट "डिटैचेस" को संशोधित किया गया है, तो यह सामग्री की नकल करके सामग्री को संशोधित करता है।