2013-01-16 16 views
6

मेरे कार्यक्रम में कुछ हुआ, और मुझे नहीं पता कि यह होना चाहिए या नहीं। और अगर ऐसा है, तो मैं क्यों नहीं दिख रहा है ..ऑब्जेक्ट्स के वेक्टर को प्रारंभ करने और आकार देने पर विनाशक को क्यों बुलाया जाता है?

कोड यह रहा:

#include <iostream> 
#include <vector> 

using namespace std; 

class A{ 
    public: 
    A(); 
    ~A(); 
}; 

A::A(){ 
    cout << "creating" << endl; 
} 

A::~A(){ 
    cout << "deleting" << endl; 
} 

int main(void){ 
    vector<vector<A > > vec; 

    vec.resize(5); 
    for(int i = 0; i < 5; ++i){ 
    vec[i].resize(5); 
    } 

    cout << "END" << endl; 

    return 0; 
} 

और यहाँ उत्पादन है:

creating 
deleting 
creating 
deleting 
creating 
deleting 
creating 
deleting 
creating 
deleting 
END 
deleting 
deleting 
[..more deleting here] 

मुझे समझ में क्यों नाशक के बाद कहा जाता है " अंत "संदेश, लेकिन पहले, मैं नहीं करता। मैंने सोचा कि जब वेक्टर का आकार बदलता है, कक्षा के निर्माता को बुलाया जाता है, लेकिन विनाशक क्यों?

+0

आप प्रतिलिपि ctor उपयोगकर्ता को परिभाषित करना भूल गए हैं। यदि आप (आउटपुट के साथ) करते हैं और प्रत्येक कॉल के आकार बदलने के बाद आउटपुट डालते हैं, तो आप देखेंगे कि क्या हो रहा है। –

उत्तर

17

सी ++ 03 vector<A>::resize() में डिफ़ॉल्ट मान A() के साथ एक डिफ़ॉल्ट पैरामीटर है। यह अस्थायी है कि नष्ट हो गया है। वैक्टर के तत्व इसकी प्रतिलिपि बनाई गई हैं।

यह सी ++ 11 में "निश्चित" है, जहां resize के दो ओवरलोड हैं। एक में एक पैरामीटर होता है, और मूल्य-किसी भी अतिरिक्त तत्व को प्रारंभ करता है। दूसरे में दो पैरामीटर हैं, और आपूर्ति के मूल्य से प्रत्येक अतिरिक्त तत्व की प्रतिलिपि बनाते हैं। सी ++ 11 इस कार्यक्रम में इस व्यवहार है:,

creating 
creating 
creating 
<repeated for a total of 25 "creating"s> 
creating 
creating 
creating 
END 
deleting 
deleting 
deleting 
<repeated for a total of 25 "deleting"s> 
deleting 
deleting 
deleting 

सी ++ 03 में अगर A का एक उदाहरण तो आश्चर्यजनक निर्माण करने के लिए है कि यह संख्या कम लायक है महंगा है, तो आप इसे 5 कोई से दाढ़ी सकता है -args- + 25 कॉपी-निर्माण 1 कोई arg- और कुछ इस तरह के साथ 25 कॉपी-निर्माण करने के लिए नीचे:

A default_value; 
for (int i = 0; i < 5; ++i) { 
    // same end result as vec[i].resize(5) 
    if (vec[i].size() >= 5) { 
     vec[i].erase(vec.begin() + 5, vec.end()); 
    } else while(vec[i].size() < 5) { 
     vec[i].push_back(default_value); 
    } 
} 

आप शायद यह थोड़ा अलग ढंग से अपने उदाहरण कोड के लिए लिख सकते हैं, और स्पष्ट रूप से तुम नहीं "अगर" मामले की आवश्यकता है। लेकिन मुझे "अन्य समय" कहने के कई अवसर नहीं मिलते हैं, इसलिए मैं इसे ले रहा हूं।

+0

यह उल्लेखनीय है कि यह कोड C++ 11 में पूरी तरह से अलग व्यवहार करता है। – Csq

+0

@Csq: हाँ, मैं आपसे आगे बढ़ रहा हूं। "रास्ते" के मूल्यों के लिए "मुश्किल" के बराबर। मैं बस उस बिट को पोस्ट करने से पहले मानक की जांच कर रहा था :-) –

+0

ठीक है .. तो सी ++ 11 के बिना इसे ठीक करने का कोई तरीका नहीं है? धन्यवाद :) – user1729422

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

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