2010-09-01 19 views
5

संभव डुप्लिकेट:
Smart pointers/safe memory management for C?सी में स्मार्ट सूचक कार्यान्वयन

मैं एक एम्बेडेड आवेदन जहाँ मैं गतिशील स्मृति में एक वस्तु का आवंटन कर रहा हूँ और अन्य मॉड्यूल के लिए चारों ओर इसे पारित किया है।

मैं इस ऑब्जेक्ट में एक स्मार्ट पॉइंटर बनाना चाहता हूं। स्मार्ट पॉइंटर्स का उपयोग और कार्यान्वयन करने के लिए सी ++ में कई उदाहरण हैं।

मैं एक सी भाषा केवल एक स्मार्ट सूचक के कार्यान्वयन की तलाश में हूं।

धन्यवाद।

+7

लेकिन ... सी में कोई कन्स्ट्रक्टर/विनाशक नहीं है! – kennytm

+1

जाहिर है, रचनाकार और विनाशक एक स्मार्ट सूचक के दिल में हैं। –

+0

हां, "स्मार्ट पॉइंटर्स" उनके बिना गूंगा "संदर्भ काउंटर" बन जाते हैं। –

उत्तर

2

हां, मुझे लगता है कि @KennyTM कहता है कि यह असंभव है (या कम से कम, उपयोगी नहीं है)। रचनाकारों और विनाशकों को स्वचालित रूप से बुलाए जाने के कारण स्मार्ट पॉइंटर्स संभव हैं। अन्यथा आपको संदर्भ() और असुरक्षा() स्वयं को कॉल करना होगा। अभी भी उपयोगी है? Smart pointers/safe memory management for C?

+0

उत्तर के लिए धन्यवाद। ऑब्जेक्ट फ्लैश मेमोरी के लिए एक हैंडल है। मैं एक और रणनीति का उपयोग करूंगा। –

1

आपको एक "अपारदर्शी" प्रकार जो पूरी तरह से समझाया गया है जिस तरह से आप ग में यह करना होगा निर्माण और ज्यादा में आप क्या चाहते हैं कर सकते हैं ++:

इसके अलावा, इस, पिछले बहुत से संबंधित तो सवाल यह देखते हैं।

इस तरह।

smartpointer.h:

typedef struct sp smartpointer; 

smartpointer new(void *content, size_t s); 
int   delete(smartpointer p) 
void*  dereference(smartpointer p); 
/* ... */ 

smartpointer.c

/* contains the definition of "struct sp" and the implementation of the 
    the functions */ 

और फिर अपने आप को वादा कभी नहीं, कभी, कभी डेटा dereference का उपयोग कर को छोड़कर उपयोग करने के लिए, लेकिन निश्चित रूप से संकलक लागू नहीं होगा वह आप के लिए है।

तो, यह सब बहुत परेशानी है, और आपको यह समझना चाहिए कि आपको क्या हासिल हो सकता है।

+1

मुझे नहीं लगता कि स्मार्ट पॉइंटर्स के साथ इसका कोई संबंध नहीं है ... –

+1

@R ..: ठीक है, यह तंत्र आपको संदर्भित पॉइंटर्स का समर्थन करने की अनुमति देता है। यह बड़ी कमजोरी को बरकरार रखता है कि आपको दायरे से बाहर जाने से पहले उन्हें स्पष्ट रूप से हटा देना चाहिए। यह ओओ भाषा समर्थन के समान ही "स्मार्ट" नहीं है, लेकिन यह संदर्भ गिनती कोड को केंद्रीकृत करता है, और मेमोरी प्रबंधन को सख्ती से स्थानीय संबंध बनाता है ... जब तक आप अनुशासन को बरकरार रखने के लिए अनुशासन को बरकरार रखते हैं। – dmckee

+0

यह ध्यान देने योग्य है कि कुछ सिस्टम जैसे कि पामोज़ आपके द्वारा वर्णित कुछ चीजें करते हैं, हालांकि उन्हें किसी ऑब्जेक्ट को डिफरेंस करने के लिए पॉइंटर का उपयोग करके किया जाने पर फ़ंक्शन को कॉल करने की आवश्यकता होती है। इस दृष्टिकोण का एक फायदा यह है कि वस्तुओं को पारदर्शी रूप से स्थानांतरित किया जा सकता है - विखंडन से परहेज - किसी भी समय जब उनके पास कोई प्रत्यक्ष संकेतक मौजूद नहीं होता है (कम से कम कोई भी जो वास्तव में कभी भी उपयोग नहीं करेगा)। – supercat

0

मैं (कम से कम) कर के रूप में स्मार्ट संकेत के बारे में सोचना आप के लिए 2 बातें करते हैं:

  • स्वचालित रूप से प्रबंधित जीवन स्मृति/वस्तु
  • स्वचालित रूप से के प्रबंधन के लिए (संसाधनों के आवंटन) स्वामित्व वस्तु की (कॉपी अर्थ विज्ञान, आदि)

दूसरा पहलू अनुमानित एक मजबूत एपीआई लागू करके हो सकता है जो लोगों को पॉइंटर्स को कॉपी/असाइन करने की अनुमति नहीं देता है।

लेकिन पहला आइटम है जहां सी ++ और रचनाकारों/विनाशकों (आरएआईआई का दिल) के लिए इसकी भाषा समर्थन वास्तव में चमकता है। यह तथ्य यह है कि कन्स्ट्रक्टर & विध्वंसकर्ताओं को कोड के माध्यम से स्वचालित रूप से संकलक द्वारा सही जगहों पर, जो जादू कार्य करता है, द्वारा स्वचालित रूप से डाला जाता है।CTORs & डीटीओआर के लिए अंतर्निहित भाषा समर्थन के बिना, आप केवल प्रभाव का अनुमान लगाएंगे, या आवश्यक होने पर उपयोगकर्ता को "सही चीज़ करने" के लिए भरोसा करेंगे।

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