2014-07-05 5 views
8

कोड का निम्न भाग पर विचार करें:ऑब्जेक्ट से स्थानांतरित किए जाने वाले विनाशक का आह्वान क्यों किया जाता है?

struct foo { 
    std::string id; 
}; 

int main() { 
    std::vector<foo> v; 

    { 
    foo tmp; 
    v.push_back(std::move(tmp)); 
    } 
} 

LIVE DEMO

कोड का टुकड़ा में प्रदर्शन किया:

  1. वर्ग foo जा रहा है के डिफ़ॉल्ट निर्माता वस्तु के निर्माण के लिए लागू किया जा करने के लिए tmp
  2. कक्षा foo के चालक कन्स्ट्रक्टर v.push_back(std::move(tmp)); कथन में शामिल किए जा रहे हैं।
  3. class foo के विनाशक को दो बार बुलाया जा रहा है।

सवाल:

  1. एक की नाशक वस्तु से चले गए दो बार कहा जाता है क्यों?
  2. वास्तव में स्थानांतरित होने वाली वस्तु से क्या स्थानांतरित किया जाता है?
+2

स्थानांतरित वस्तु से केवल एक बार नष्ट हो जाता है। प्रत्येक वस्तु एक बार बनाई जाती है और एक बार नष्ट हो जाती है। दो विनाशक कॉल 'tmp', और वेक्टर में ऑब्जेक्ट के लिए हैं। –

उत्तर

2

क्यों एक स्थानांतरित वस्तु के विनाशक को दो बार बुलाया जाता है?

पहले नाशक नष्ट कर देता है ले जाया गया-से tmp जब वह पहली बार }main() में कम से क्षेत्र से बाहर चला जाता है। दूसरा विनाशक को '0 में main() के अंत में v के दायरे से बाहर चला गया है, जिसे foo को स्थानांतरित किया गया है।

वास्तव में स्थानांतरित होने वाली वस्तु से क्या स्थानांतरित किया जाता है?

संकलक उत्पन्न कदम निर्माता चाल-निर्माणों id है, जो एक std::string है। std::string का एक चालक कन्स्ट्रक्टर आमतौर पर वास्तविक स्ट्रिंग को संग्रहीत करने वाली वस्तु से स्मृति के ब्लॉक का स्वामित्व लेता है, और स्थानांतरित वस्तु से वैध लेकिन अनिर्दिष्ट स्थिति (अभ्यास में, संभवतः एक खाली स्ट्रिंग) पर सेट करता है।

+0

"टीएम को नष्ट कर देता है, इसे स्थानांतरित करने के बाद": ठीक है, यह स्कोप ('}' push_back के बाद 'छोड़ने के गुण से नष्ट हो जाता है, तुरंत इसे हटाए जाने के तुरंत बाद नहीं (';' push_back के बाद)। यह महत्वपूर्ण है कि 'push_back' और'} 'के बीच अधिक कोड है। –

+0

@AndreKostur मैं यह इंगित करने का इरादा नहीं रख रहा था कि 'tmp' से स्थानांतरित होने और 'tmp' नष्ट होने के बीच एक अनौपचारिक संबंध है; इसका उद्देश्य यह बताने का था कि ओपी के डेमो में पहले विनाशक आउटपुट ने एक खाली स्ट्रिंग मुद्रित क्यों की, और इसके विनाश के समय 'tmp' की स्थिति का वर्णन किया। मैं देखता हूं कि यह भ्रमित हो सकता है, हालांकि, इतना स्पष्ट है। –

संबंधित मुद्दे

 संबंधित मुद्दे