इस से इसे जारी रखते हुए: Is the destructor called when a delegating constructor throws?क्या एक प्रतिनिधि कन्स्ट्रक्टर फेंकता है जब स्मृति स्वचालित रूप से पुनः दावा किया जाता है?
class X
{
public:
X() {};
X(int) : X() { throw std::exception(); }
X(double) { throw std::exception(); }
~X();
};
क्या गतिशील स्मृति के बारे में? आम तौर पर कन्स्ट्रक्टर में एक अपवाद का मतलब है कि वस्तु पूरी तरह से निर्मित नहीं हुई थी और इस प्रकार स्मृति साफ हो गई और खो नहीं गई।
लेकिन पिछले प्रश्न में तर्क यह है कि प्रतिनिधि पूरी होने के बाद ऑब्जेक्ट पूरी तरह से निर्मित (या पूरी तरह से प्रारंभ किया गया) है। यह स्मृति को पुनः प्राप्त करने पर कैसे प्रभाव डालता है? मुझे आशा है कि स्मृति अभी भी साफ हो गई है!
int main()
{
new X(5); // new called
// delete called because delegate completed.
// I assume:
// Memory re-claimed (because constructor did not complete)
// I assume the C++11 standard adjusted to compensate.
// As a constructor did complete.
}
भी तुलना: स्मृति, साफ है
int main()
{
new X(5.0); // new called
// Delete **NOT** called
// Memory re-claimed (because constructor did not complete)
}
तो जब स्मृति सफाई की परिभाषा ही सी ++ 03 कल्पना से बदल जाना चाहिए। व्यवहार कैसे बदलता है?
मानक कहता है कि "अगर किसी ऑब्जेक्ट के लिए गैर-प्रतिनिधि कन्स्ट्रक्टर निष्पादन पूरा कर चुका है और उस ऑब्जेक्ट के लिए एक प्रतिनिधि कन्स्ट्रक्टर अपवाद के साथ निकलता है, ऑब्जेक्ट के विनाशक को बुलाया जाएगा। " तो विनाशक आह्वान किया जाता है। यदि वह आपके प्रश्न का उत्तर नहीं देता है, तो यह कम से कम मेरे लिए अपर्याप्त रूप से स्पष्ट है। –
@ डेविडस्वार्टज़: विनाश नहीं किया गया लेकिन पुनः दावा किया गया। सी ++ 03 में कन्स्ट्रक्टर में एक अपवाद रिसाव नहीं करता है, क्योंकि कन्स्ट्रक्टर से बचने वाला अपवाद ऑब्जेक्ट को पूरी तरह से गठित नहीं करता है। लेकिन यहां वस्तु पूरी तरह से बनाई गई है। मेरा सवाल वास्तव में सी ++ 03 से हैंडलिंग कैसे बदल गया है। –
@ डेविडस्वार्टज़: आपको इसे एक उत्तर के रूप में पोस्ट करना चाहिए (आदर्श रूप से संदर्भ के साथ)। मैं देखता हूं कि थोड़ी खतरनाक चीज के रूप में ... –