यह कहा जाता है नहीं कर रहा है जब आप push_back
, यह कहा जाता है जब अस्थायी नष्ट हो जाता है।
अपने उदाहरण में इसे ठीक करने के लिए:
TEST test;
for (int i = 0; i < 5; ++i)
{
m_test.push_back(test);
}
केवल एक बार बुलाना चाहिए।
आपका कोड लूप के भीतर अस्थायी TEST
बना रहा है, इसे push_back
में उपयोग करके, तब लूप समाप्त होता है/दोहराने और नष्ट होने पर अस्थायी रूप से बाहर निकलता है। ऐसा ठीक उसी तरह होता है, क्योंकि अस्थायी TEST
को साफ़ करने की आवश्यकता है।
यदि आप इससे बचना चाहते हैं, तो आपको कुछ और करने की आवश्यकता है लेकिन प्रत्येक धक्का के लिए एक अस्थायी वस्तु बनाना है। एक संभावित समाधान यह है:
vector<TEST> m_test(5); // Note reserving space in the vector for 5 objects
std::fill(m_test.begin(), m_test.end(), TEST()); // Fill the vector with the default ctor
आपके एसटीएल को अनुकूलित करने के तरीके के आधार पर, इसे कई प्रतियां बनाने की आवश्यकता नहीं हो सकती है।
तुम भी बेहतर हैंडलिंग पाने के लिए यदि आप अपने TEST
कक्षा में एक प्रतिलिपि निर्माता लागू की तरह, सक्षम हो सकते हैं:
TEST::TEST(const TEST & other)
{
x = new int(*other.x); // Not entirely safe, but the simplest copy ctor for this example.
}
क्या यह उचित है, या आप इसे कैसे संभाल, अपने वर्ग और उसके पर निर्भर करता है जरूरत है, लेकिन जब आप अपने नियमित कन्स्ट्रक्टर और विनाशक को परिभाषित करते हैं तो आपको आमतौर पर एक प्रतिलिपि बनाना चाहिए (अन्यथा संकलक एक उत्पन्न करेगा, और इस मामले में, इसके परिणामस्वरूप प्रतिलिपि बनाई जाएगी और पॉइंटर्स को x
पर लटकाना होगा)।
सी ++ 11 में, आप अस्थायी बनाने से बचने के लिए 'm_test.emplace_back()' का उपयोग कर सकते हैं। किसी भी मामले में, हमेशा [नियम का तीन] याद रखें (http://stackoverflow.com/questions/4172722)। –