पहली बात गौर करने योग्य स्मृति नए के साथ आवंटित करने और हटाने पूरी तरह से कर रहा है वैश्विक। पॉइंटर्स दायरे से बाहर निकलने पर या फ़ंक्शन समाप्त होने पर चीजें स्वचालित रूप से हटाई नहीं जाती हैं। जब तक आपके पास आवंटन के लिए सूचक होता है (जैसे कि पॉइंटर वहां लौटाया जा रहा है) जब भी आप कभी भी और जहां चाहें इसे हटा सकते हैं। चाल, बस यह सुनिश्चित कर रही है कि अन्य सामान इसे जानने के साथ इसे हटा नहीं देते हैं।
जो फस्ट्रीम रीड फ़ंक्शन के फ़ंक्शन स्ट्रक्चर के प्रकार के साथ लाभ है। यह स्पष्ट रूप से स्पष्ट है कि वह कार्य जो करने जा रहा है वह आपके द्वारा प्रदान किए गए बफर में बाइट्स की 'आकार' संख्या पढ़ा जाता है, इससे कोई फर्क नहीं पड़ता कि बफर को नए का उपयोग करके आवंटित किया गया है, चाहे वह स्थिर या वैश्विक बफर हो या फिर भी एक स्थानीय बफर, या यहां तक कि एक स्थानीय संरचना के लिए सिर्फ एक सूचक। और यह भी स्पष्ट रूप से स्पष्ट है कि यह कार्य उस डेटा को पढ़ने के बाद आपके द्वारा पारित बफर के साथ और कुछ नहीं करने जा रहा है।
दूसरी तरफ, अपने रीडब्लॉक फ़ंक्शन की संरचना लें; अगर आपके पास कोड नहीं था तो यह पता लगाना मुश्किल होगा कि यह वास्तव में क्या लौट रहा था। क्या यह नई याददाश्त के लिए एक सूचक वापस कर रहा है? यदि ऐसा है तो क्या आप इसे हटाने की उम्मीद कर रहे हैं? क्या यह इसे हटा देगा यह स्वयं है? अगर ऐसा हैं तोह कब? क्या यह भी एक नया सूचक है? क्या यह सिर्फ कुछ साझा स्थिर बफर को पता भेज रहा है? यदि हां, तो बफर कब अमान्य हो जाएगा (उदाहरण के लिए, किसी और चीज द्वारा ओवरराइट किया गया)
रीडब्लॉक को कोड देखकर, यह स्पष्ट है कि यह नई स्मृति में पॉइंटर लौटा रहा है, और आपको हटाने की उम्मीद है जब कभी आप इसके साथ किया जाता है। जब तक आप इसे हटा नहीं देते तब तक बफर कभी ओवरराइट नहीं किया जाएगा या अमान्य हो जाएगा।
गति के अनुसार, fsream.read के दूसरे लाभ को आप 'बफर' सॉर्ट आउट करते हैं: स्मृति आवंटित होने पर आपको पसंद मिलती है। यदि आप जा रहे हैं "डेटा पढ़ना, प्रक्रिया, बफर हटाएं, डेटा प्रक्रिया को बफर हटाएं, ect ...." यह केवल एक बफर आवंटित करने के लिए अधिक कुशल होगा (अधिकतम आकार के लिए आपको इसकी आवश्यकता होगी, यह होगा आपके सबसे बड़े एकल पढ़ने का आकार) और स्टीफन द्वारा सुझाए गए अनुसार, सब कुछ के लिए इसका उपयोग करें।
+1। यह एक बड़ा सवाल है! यह मैन्युअल मेमोरी आवंटन के लिए बहुत से नए आने वालों को रोकता है। – Anthony
यह एक भयानक सवाल है, नए आने वालों को 'std :: string' या 'std :: vector' का उपयोग करना सीखना चाहिए। –
@ मैट्टीयू: सीखने के बजाय std :: string और std :: वेक्टर हुड के नीचे कैसे काम करता है? मुझे लगता है कि यह एक अच्छा सवाल है, हालांकि मैं पक्षपातपूर्ण हो सकता हूं क्योंकि यह एक है जो मैं खुद को रखता हूं, क्योंकि मैं यह जानने के बिना यादृच्छिक पुस्तकालयों का उपयोग करना नहीं चाहता हूं कि वे क्या कर रहे हैं। – abelito