मान लीजिए मैं एक वर्ग जो एक आंतरिक बफर करने के लिए एक सूचक का प्रबंधन करता है: एक प्रतिलिपि सहित अबएक आंतरिक बफर करने के लिए एक सूचक के साथ अर्थ विज्ञान ले जाएँ
class Foo
{
public:
Foo();
...
private:
std::vector<unsigned char> m_buffer;
unsigned char* m_pointer;
};
Foo::Foo()
{
m_buffer.resize(100);
m_pointer = &m_buffer[0];
}
, मान लीजिए मैं भी सही ढंग से लागू कर दिया है शासन-ऑफ-द 3 सामान निर्माता जो प्रतियां आंतरिक बफर, और फिर आंतरिक बफर के नई प्रतिलिपि करने के लिए सूचक reassigns:
Foo::Foo(const Foo& f)
{
m_buffer = f.m_buffer;
m_pointer = &m_buffer[0];
}
मैं भी चाल अर्थ विज्ञान लागू करते हैं तो यह सिर्फ सूचक कॉपी और बफर स्थानांतरित करने के लिए सुरक्षित है?
Foo::Foo(Foo&& f) : m_buffer(std::move(f.m_buffer)), m_pointer(f.m_pointer)
{ }
व्यवहार में, मैं जानता हूँ कि यह काम करना चाहिए, क्योंकि std::vector
चाल निर्माता सिर्फ आंतरिक सूचक बढ़ रहा है - यह वास्तव में कुछ भी नहीं कर रहा है पुनः दिए तो m_pointer
अभी भी एक वैध पते के लिए अंक। हालांकि, मुझे यकीन नहीं है कि मानक इस व्यवहार की गारंटी देता है या नहीं। std::vector
स्थानांतरित करें अर्थशास्त्र की गारंटी है कि कोई पुनर्वितरण नहीं होगा, और इस प्रकार वेक्टर के सभी पॉइंटर्स/इटरेटर वैध हैं?
मुझे पता है कि 'स्वैप' गारंटी देता है कि पॉइंटर्स अभी भी मान्य होंगे, लेकिन मुझे चाल के बारे में निश्चित नहीं है। –
[संबंधित प्रश्न] (http://stackoverflow.com/q/17730689/1782465) पर इन मुद्दों के बारे में बहुत लंबी चर्चा हुई थी। मेरा मानना है कि निष्कर्ष यह है कि एक कदम सीटीओआर में, बफर को केवल स्थानांतरित करने की गारंटी है। एक चाल असाइनमेंट ओप में, यह हो सकता है (आवंटक गुणों के आधार पर) कि बफर की प्रतिलिपि बनाई जाएगी। – Angew
क्या आप चालक के शरीर में 'f.m_pointer = nullptr;' नहीं कर रहे हैं? यह एक ऐसे पते पर क्यों इंगित करता है जो उसके भाई बहन नहीं है? यदि आपके पास दो चर के बीच युग्मन है जो काफी तंग है, तो मैं कहूंगा कि क्रॉस युग्मन करने के बजाय इसे इस तरह रखें। – legends2k