2012-08-12 16 views
8

यदि मैं सही ढंग से समझता हूं, जब एक shared_ptr (बूस्ट, tr1, std, जो भी हो) को एक पॉइंटर के साथ ताजा आवंटित ऑब्जेक्ट में प्रारंभ किया जाता है, तो साझा_प्टर का कन्स्ट्रक्टर पॉइंटर के लिए संदर्भ गणना रखने के लिए स्मृति की एक छोटी राशि आवंटित करता है प्रबंधन करता है। क्या होता है यदि वह आवंटन विफल हो जाता है? निम्नलिखित कोड में:क्या होता है यदि कोई साझा_प्टर का निर्माता विफल रहता है?

class my_class {}; 
void my_func(shared_ptr<my_class> arg); 

int main(int argc, char* argv[]) 
{ 
    my_func(shared_ptr<my_class>(new my_class())); 
    return 0; 
} 

... my_class वस्तु अगर shared_ptr इसके संदर्भ गिनती के लिए स्मृति को आबंटित करने में विफल रहता है लीक किया जाएगा? या क्या share_ptr का कन्स्ट्रक्टर ऑब्जेक्ट को हटाने की ज़िम्मेदारी लेता है?

उत्तर

7

आपका कोड my_class ऑब्जेक्ट को रिसाव नहीं करेगा, भले ही shared_ptr स्मृति आवंटित नहीं किया जा सका।

सी ++ 11 मानक (20.7.2.2.1), shared_ptr निर्माता में के अनुसार:

फेंकता: bad_alloc, या एक कार्यान्वयन-de फाई नेड अपवाद जब एक संसाधन स्मृति के अलावा अन्य नहीं कर सका प्राप्त हो।

अपवाद सुरक्षा: यदि कोई अपवाद फेंक दिया गया है, तो पी को हटाएं।

कन्स्ट्रक्टर संस्करण में जो उपयोगकर्ता द्वारा परिभाषित डिलीटर लेता है, इसके बजाय डिलीटर का उपयोग किया जाएगा।

Boost documentation वही निर्दिष्ट करता है।

+0

चीयर्स। मैंने Google को आग लगा दी लेकिन मुझे कोई जवाब नहीं मिला। इन दिनों में से एक मैं स्रोत - यानी मानक की जांच करना सीखूंगा। :-) – bythescruff

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