2011-09-23 8 views
16

folowing कोड से पता चलता एक आउटपुट की उम्मीद नहीं:एसटीएल वेक्टर एक नहीं आवंटित वस्तु का एक नाशक बुला है?

class test 
{ 
    public: 
    test() 
    { 
     std::cout << "Created" << (long)this << std::endl; 
    } 
    ~test() 
    { 
     std::cout << "Destroyed" << (long)this << std::endl; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    std::vector<test> v; 
    test t; 
    v.push_back(t); 

    return EXIT_SUCCESS; 
} 

जब निष्पादित यह पता चलता है:

Created-1077942161 
Destroyed-1077942161 
Destroyed674242816 

मुझे लगता है कि दूसरी "नष्ट" उत्पादन वहाँ नहीं होना चाहिए। जब मैं वेक्टर का उपयोग नहीं करता हूं तो परिणाम एक निर्मित और एक नष्ट लाइन के रूप में अपेक्षित है। क्या यह व्यवहार सामान्य है?

(यह एक FreeBSD सिस्टम पर जीसीसी के साथ संकलित किया गया है)

+3

+1 [एसएससीसीई] (http://sscce.org/) – Flexo

+3

के लिए +1 पॉइंटर्स प्रिंट करने के लिए पॉइंटर को डालना सर्वोत्तम है: 'std :: cout << (शून्य *) यह << std :: endl ; '। –

+0

इसके अलावा लौटने 'EXIT_SUCCESS' वैकल्पिक है। आप रिटर्न वैल्यू को 'मुख्य' में छोड़ सकते हैं, यह '0' लौटाएगा (जो आपके प्लेटफ़ॉर्म के लिए" सामान्य समाप्ति "का मतलब है) –

उत्तर

31

सब कुछ है के रूप में यह होना चाहिए: वहाँ स्थानीय चर t, जो बनाया और फिर नष्ट हो जाता है main() के अंत में है, और v[0] जो हो जाता है वहाँ, बनाया है और main() के अंत में नष्ट कर दिया।

आप v[0] के निर्माण को नहीं देख पा क्योंकि कि नकल से होता है या निर्माता के लिए कदम है, जो अपने परीक्षण वर्ग प्रदान नहीं करता है। (तो संकलक आप के लिए एक है, लेकिन उत्पादन के बिना प्रदान करता है।)


परीक्षण प्रयोजनों के लिए यह अपने आप के लिए लिखने के लिए एक बार काम है और कहा कि सभी के लिए एक परीक्षण वर्ग के लिए सभी संभव कंस्ट्रक्टर्स, विनाशकर्ता, असाइनमेंट और स्वैप ऑपरेटरों शामिल और इसलिए आप देख सकते हैं जब कंटेनर और एल्गोरिदम में इस्तेमाल कैसे वस्तुओं से व्यवहार से प्रत्येक में एक नैदानिक ​​लाइन प्रिंट।

+0

यह 'कदम constructor' नहीं हो सकता। – Nawaz

+0

@Namaz: ठीक है। चालक कन्स्ट्रक्टर का उपयोग करने के लिए, आपको eitehr 'v.push_back (std :: move (t))', या 'v.push_back (test()) 'कहना होगा। हालांकि, दोनों संदेशों का एक समान अनुक्रम बनाएंगे। –

29
#include <cstdlib> 
#include <vector> 
#include <iostream> 

class test 
{ 
    public: 
    test() 
    { 
     std::cout << "Created " << (long)this << std::endl; 
    } 
    test(const test&) 
    { 
     std::cout << "Copied " << (long)this << std::endl; 
    } 
    ~test() 
    { 
     std::cout << "Destroyed " << (long)this << std::endl; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    std::vector<test> v; 
    test t; 
    v.push_back(t); 

    return EXIT_SUCCESS; 
} 

आउटपुट:

Created -1076546929 
Copied 147865608 
Destroyed -1076546929 
Destroyed 147865608 

std::vector::push_back प्रतियां t वस्तु, आप प्रतिलिपि निर्माता देख सकते हैं इसके बाद के संस्करण कोड द्वारा लाया जा रहा है।

2

वेक्टर t की एक प्रति धारण कर रहा है, इसलिए push_back पर कॉल करने के बाद, आपके पास t के दो संस्करण हैं ... एक स्टैक पर और एक वेक्टर में। चूंकि वेक्टर संस्करण एक कॉपी-कंस्ट्रक्टर द्वारा बनाया गया था, इसलिए आपको उस ऑब्जेक्ट के लिए "बनाया गया ..." प्रॉम्प्ट नहीं दिखाई देता है ... लेकिन जब भी वेक्टर कंटेनर गुंजाइश से बाहर हो जाता है तब भी इसे नष्ट किया जाना चाहिए, इसलिए आपको दो मिलते हैं "नष्ट ..." संदेश।

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