2010-08-29 11 views
6

यहाँ बुलाया कोड (भी http://pastebin.com/yw5z2hnG पर) है:सी ++ बहुत सारे विनाशकर्ता तो कुछ वस्तुओं

#include <iostream> 
#include <vector> 
using namespace std; 

class X 
{ 
    public: 
    int i; 
    X(); 
    ~X(); 
}; 

X::X() 
{ 
    i = 1; 
    cout << "---constructor" << '\n'; 
} 

X::~X() 
{ 
    cout << "***desctructor" << '\n'; 
} 

int main() 
{ 
    vector<X> *vx = new vector<X>; 
    cout << "------------------------------------" << endl; 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    vx->push_back(X()); 
    cout << "------------------------------------" << endl; 
    delete vx; 
} 

मैं उत्पादन के रूप में:

------------------------------------ 
---constructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
***desctructor 
---constructor 
***desctructor 
---constructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
------------------------------------ 
***desctructor 
***desctructor 
***desctructor 
***desctructor 
***desctructor 

मुझे समझ नहीं आता क्यों इतनी सारी विनाशकर्ता हैं बुलाया।

+1

के लिए 5 प्रति रचनाकार और विनाशक मिलते हैं, यह कई बार एक डुप्लिकेट है ... लेकिन मैं उन्हें नहीं ढूंढ सकता इस सवाल से पूछने वाले लोगों को आमतौर पर निहित रूप से परिभाषित प्रति रचनाकारों के बारे में पता नहीं होता है: पी मुझे हमेशा यह मजाकिया लगता है कि अज्ञानता सीखने से रोक सकती है क्योंकि यह किसी को कुशलता से पूछताछ से रोकती है। –

उत्तर

14

आप अपनी स्वयं की प्रतिलिपि निर्माता को परिभाषित यदि आप अन्य वस्तुओं निर्माण किया जा रहा देखेंगे:

class X 
{ 
    public: 
    int i; 
    X(const X&); 
    X(); 
    ~X(); 
}; 

X::X(const X& x) : i(x.i) 
{ 
    cout << "---copy constructor\n"; 
} 

// ... rest as before 

संकलक एक प्रति निर्माता है कि कोई प्रवेश करता है, तो आप अपने खुद के एक नहीं घोषित करते हैं प्रदान करेगा।

+0

+1: लागू प्रतियां कारण हैं। – Puppy

1

एक और अधिक विस्तार - अगर आप अग्रिम में अपने वेक्टर के लिए स्थान आरक्षित: आप वेक्टर भी प्रतियां सभी देख सकते हैं के रूप में

---constructor 
+++ copy constructor 
***desctructor 
---constructor 
+++ copy constructor 
***desctructor 
... 

तो:

int main() 
{ 
    vector<X> *vx = new vector<X>; 
    vx->reserve(5); 
    .... 

तो आप निम्न उत्पादन मिल जाएगा इसके तत्वों को जब इसे अपने भंडारण को पुन: आवंटित करने की आवश्यकता होती है - यही कारण है कि आपको पिछले push_back()

+0

आपके उत्तर ने बहुत मदद की। जहां भी संभव हो, मैं न केवल वैक्टरों को आरक्षित करता हूं। मेरा कार्यक्रम बहुत तेज़ चलता है। धन्यवाद! – Xolve

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