मैं निम्नलिखित छोटे से कार्यक्रम बना दिया है: (मूल रूप से एक वर्ग अगर यह, बनाया जाता है नकल या नष्ट कर दिया और एक मुख्य बात का कुछ करता है कि COUTS कि)एसटीडी C++ कंटेनर तत्व विनाश और सम्मिलन व्यवहार
class Foo
{
public:
Foo(string name): _name(name)
{
cout << "Instance " << _name << " of Foo created!" << std::endl;
};
Foo(const Foo& other): _name(other._name)
{
cout << "Instance " << _name << " of Foo copied!" << std::endl;
};
~Foo()
{
cout << "Instance " << _name << " of Foo destroyed!" << std::endl;
}
string _name;
};
int main(int argc, char**argv)
{
Foo albert("Albert");
Foo bert("Bert");
{
vector<Foo> v1, v2;
system("PAUSE");
v1.push_back(albert);
system("PAUSE");
v2.push_back(bert);
system("PAUSE");
v1 = v2;
system("PAUSE");
}
system("PAUSE");
}
आउटपुट इस तरह दिखता है:
Instance Albert of class Foo created!
Instance Bert of class Foo created!
Press any key...
Instance Albert of class Foo copied!
Instance Albert of class Foo copied! // why another copy?
Instance Albert of class Foo destroyed! // and destruction?
Press any key...
Instance Bert of class Foo copied!
Instance Bert of class Foo copied!
Instance Bert of class Foo destroyed!
Press any key... // v1=v2 why did the albert instance not get destroyed?
Press any key...
Instance Bert of class A destroyed!
Instance Bert of class A destroyed!
Press any key... // there's still an albert living in the void
यह मुझे बहुत अजीब तरह से मारता है। यदि मैं दो बार प्रतिलिपि बना देता हूं तो मैं किसी संदर्भ के रूप में कुछ गुजरना क्यों परेशान करता हूं? v1.operator = (अन्य) तत्वों को नष्ट क्यों नहीं करता है? यह shared_ptr के व्यवहार के साथ अच्छी तरह से फिट होगा। क्या कोई मुझे बता सकता है क्यों?
अलावा मैं इस एक अंतहीन लूप में डाल दिया और mem उपयोग की जाँच की, यह कम से कम एक सदस्य रिसाव का उत्पादन करने के प्रतीत नहीं होता।
अतिरिक्त ठीक है, mem कोई समस्या नहीं है क्योंकि यह कॉपी ctor के बजाय ऑपरेटर = का उपयोग करता है, ठीक है धन्यवाद। जब मैं
v1.reserve(10);
v2.reserve(10);
जोड़ने प्रतियों की तार्किक संख्या जगह लेता है। इसके बिना यह प्रत्येक एकल push_back के लिए पूरे वेक्टर को पुन: आवंटित करता है और प्रतिलिपि बनाता है, (जिसे मैं छोटे वैक्टरों के लिए भी काफी मंद करता हूं)। इस को देखते हुए मैं और अधिक .reserve उपयोग करने पर विचार और मेरे काम ऑपरेटरों का अनुकूलन नरक की तरह होगा :)
अलावा: सारांश
- ये सभी मुद्दे कुलपति ++ 2005 के लिए विशिष्ट लगते हैं।
- यदि दो कंटेनरों का आकार मेल खाता है, तो मेरा कार्यान्वयन पुराने लोगों को नष्ट करने और नए लोगों की प्रतिलिपि बनाने के बजाय ध्वनि अभ्यास की बजाय तत्वों पर ऑपरेटर = का उपयोग करता है। यदि आकार भिन्न हैं, सामान्य विनाश और प्रतिलिपि का उपयोग किया जाता है।
- 2005 कार्यान्वयन के साथ, किसी को आरक्षित का उपयोग करना होगा! अन्यथा अबाध और std अनुरूप प्रदर्शन नहीं।
- ये काले बक्से मेरे विचार से कहीं अधिक काले हैं।
क्या आपने इसे रिलीज बिल्ड के रूप में संकलित करने का प्रयास किया था? – jalf
हां। वही परिणाम – AndreasT
अपने आप को आजमाएं, बस एक खाली परियोजना में पेस्ट कॉपी करें और, iostream, वेक्टर और स्ट्रिंग को शामिल करें, और जाएं। – AndreasT