मैं उद्देश्य सी से सी ++ से कुछ कोड पोर्ट करने की प्रक्रिया में हूं। मैं सी ++ डिजाइन पैटर्न से परिचित नहीं हूं क्योंकि मैं उद्देश्य सी के साथ हूं। कोको दुनिया में, फैक्ट्री विधि लिखने का एक बहुत ही सामान्य पैटर्न है जो "ऑटोरेलेज्ड" ऑब्जेक्ट देता है। Somethings के रूप में सरल:सी ++ में उद्देश्य सी "autorelease" - ऑब्जेक्ट जीवनकाल को नियंत्रित करने के लिए मानक तरीका?
- (MyClass *)load {
MyClass* obj = [[MyClass alloc] init];
return [obj autorelease];
}
यह समझना आसान और आसान है। विधि आवंटित स्मृति का मालिक है, लेकिन इसे वापस कॉलर को सौंप सकती है, साथ ही स्वामित्व को छोड़कर। कॉलर को उस स्मृति के साथ क्या करना है या उसे ध्यान में रखना नहीं है। यदि यह इसे बरकरार रखता है, तो वस्तु जीवित रहेगी। अगर इसे पूरी तरह नजरअंदाज कर दिया जाता है, तो वर्तमान कॉल स्टैक अवांछित होने के बाद स्मृति को कुछ समय से मुक्त कर दिया जाएगा।
मैं सी ++ में कुछ घबराहट के साथ इस आ रहा हूँ, क्योंकि अपने गैर रेफरी बार गणना वातावरण काफी के रूप में autorelease
के रूप में साफ है, या उस के साथ-साथ में उन लोगों के रूप में परिभाषित किया गया है स्वामित्व नीति के किसी भी प्रकार के लिए कुछ भी दिखाई नहीं देता कोको ढांचे। सी ++ में इस तरह के पैटर्न के लिए सर्वोत्तम प्रथाएं क्या हैं?
मैं auto_ptr के बारे में पता कर रहा हूँ, लेकिन वहां भी इसके उपयोग के साथ चिंताओं की विशाल संख्या के हैं, और यह के रूप में हर जगह का autorelease
के रूप में (अजीब प्रतिलिपि अर्थ विज्ञान, सरणियों के लिए कोई समर्थन, एसटीएल कंटेनर के साथ असंगति होने के लिए भी कई कमियों के लिए लगता है , आदि)।
बूस्ट स्मार्ट पॉइंटर्स भी एक स्पष्ट उम्मीदवार हैं, और कुछ अपने संदर्भ गणना को भी लागू करते हैं। ऐसा लगता है कि इस भयानक घटना के लिए तीसरी पार्टी लाइब्रेरी पर दुबला होना मेरे लिए थोड़ा अजीब लगता है।
सी का एक और विकल्प केवल वापस लौटाई गई स्मृति को जारी नहीं करेगा, लेकिन सामान्यतः अपनाया जाने वाला नामकरण सम्मेलन के माध्यम से इंगित करें कि कॉलर अब लौटा हुआ ऑब्जेक्ट का मालिक है। यह थोड़ा पुरातन लगता है, और अदृश्य लीक के लिए प्रवण है कॉलर गलती से वापसी मूल्य को अनदेखा करना चाहिए।
"हालांकि मुझे यह कुछ अजीब लगता है कि इस पार्टी के लिए तीसरी पार्टी लाइब्रेरी पर दुबला होना पड़ेगा।" इस्की आद्त डाल लो। इस तरह सी ++ में चीजें की जाती हैं: आपको पुस्तकालय मिलते हैं जो आपको चाहिए, और आप उनका उपयोग करते हैं। स्मृति की स्वामित्व सी ++ में वाक्य रचनात्मक नहीं है; यह * हमेशा * मैनुअल है। –