क्या एक स्मार्ट पॉइंटर लिखना संभव है जो ऑब्जेक्ट को अपने कन्स्ट्रक्टर में आवंटित करता है - डेवलपर को new
पर कॉल करने के बजाय? दूसरे शब्दों में, बजाय लिखने के लिए:एक स्मार्ट पॉइंटर अपने कन्स्ट्रक्टर में मेरे लिए नया() क्यों नहीं कॉल कर सकता है?
std::unique_ptr<myClass> my_ptr(new myClass(arg1, arg2))
... एक लिख सकते हैं:
std::smarter_ptr<myClass> my_ptr(arg1, arg2)
भाषा वाक्य रचना इस व्यक्त करने में सक्षम है? क्या यह वांछनीय होगा? घृणित? मैं इस गलती के खिलाफ की रक्षा करने के विशेष रूप से सोच रहा हूँ (अपने आप को जो मैं कर दिया है, निश्चित रूप से):
myFunction(std::unique_ptr<myClass>(new myClass()), std::unique_ptr<myClass>(new myClass()))
... जो लीक जोखिम जो भी वस्तु पहले आवंटित किया जाता है, तो दूसरा आवंटन होता है और फेंकता पहले ऑब्जेक्ट को अपने स्मार्ट पॉइंटर में सुरक्षित रूप से ensconced से पहले। लेकिन क्या एक बेहतर सूचक वास्तव में यह सुरक्षित बनाएगा?
@ जो: यह एक चिंता है; जेनरेट कोड के लिए एक स्मार्ट पॉइंटर शुरू करने के परिणामस्वरूप उपयोग करने से पहले दो 'नए' अभिव्यक्तियों को निष्पादित करना काफी संभव है; अगर दूसरे फेंकता है तो आपको एक रिसाव मिलेगा। –
@ जो: आप गलत हैं। 'tmp1 = नया myClass(); tmp2 = नया myClass(); arg1 = std :: unique_ptr (tmp1); arg2 = std :: unique_ptr (tmp2); MyFunction (arg1, arg2); 'एक पूरी तरह से कानूनी निष्पादन आदेश है। –
काफी मेला, मैं खुद को गलत साबित करने की जांच कर रहा था। धन्यवाद। – Joe