मैं कोड के एक अनुभाग पर काम कर रहा हूं जिसमें कई संभावित विफलता बिंदु हैं जो इसे जल्दी से कार्य से बाहर निकलने का कारण बनते हैं। जिस पुस्तकालयों के साथ मैं बातचीत कर रहा हूं, उसके लिए आवश्यक है कि सी-स्टाइल सरणी कार्यों को पारित की जाए। तो, बजाय हर निकास बिंदु पर पहुंच सरणियों पर हटाना बुलाने की, मैं यह कर रहा हूँ:क्या आप सी-स्टाइल सरणी के RAII के लिए shared_ptr का उपयोग कर सकते हैं?
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength]);
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}
मैं unique_ptr
, उपयोग करना चाहता था लेकिन मेरे वर्तमान संकलक इसका समर्थन नहीं करता और संदर्भ गिनती भूमि के ऊपर नहीं है वास्तव में इस मामले में कोई फर्क नहीं पड़ता।
मैं सोच रहा हूं कि विरासत कोड के साथ इंटरफेसिंग करते समय किसी के पास इस अभ्यास पर कोई विचार है या नहीं।
अद्यतन मैं पूरी तरह से shared_ptr
delete []
के बजाय delete
बुला के बारे में भूल गया था। मैंने अभी कोई स्मृति रिसाव नहीं देखा और इसके साथ जाने का फैसला किया। एक वेक्टर का उपयोग करने के लिए भी सोचा नहीं था। चूंकि मैं हाल ही में (मेरे लिए) सी ++ में डीलिंग कर रहा हूं, मुझे लगता है कि मुझे लगता है कि "यदि आपके पास एकमात्र उपकरण है तो एक हथौड़ा है, सबकुछ एक नाखून जैसा दिखता है।" सिंड्रोम। प्रतिक्रिया के लिए धन्यवाद।
UPDATE2 मुझे लगा कि मैं सवाल बदलूंगा और इसे एक ही गलती करने वाले व्यक्ति के लिए थोड़ा और मूल्यवान बनाने का उत्तर प्रदान करूंगा। हालांकि वहां scoped_array
, shared_array
और vector
की तरह विकल्प हैं, आप एक shared_ptr
का उपयोग एक सरणी के दायरे का प्रबंधन कर सकते हैं (लेकिन इस के बाद मुझे पता नहीं क्यों मुझे चाहेगा है):
template <typename T>
class ArrayDeleter
{
public:
void operator() (T* d) const
{
delete [] d;
}
};
void SomeFunction(int arrayLength)
{
shared_ptr<char> raiiArray(new char[arrayLength], ArrayDeleter<char>());
pArray = raiiArray.get();
if(SomeFunctionThatRequiresCArray(pArray) == FAILED) { return; }
//etc.
}
नाइटपिकिंग: [[shared_ptr]] गतिशील सरणी पॉइंटर्स पर सही ढंग से काम नहीं करता है। [[scoped_array]] या [[shared_array]] का उपयोग करें। इस मामले में – rwong