[संगीत बजाना] डौग लॉयड: ठीक है तो एक सुझाव यहां शुरू होने से पहले। आप वीडियो पर नहीं देखा गया है आप तो पहले करना चाहते हो सकता संकेत दिए। इस वीडियो है, क्योंकि एक और संकेत के साथ काम करने का तरीका है। तो यह बात करने के लिए जा रहा है कुछ अवधारणाओं के बारे में हम में है कि कवर वीडियो संकेत, और हम कर रहे हैं अब उन पर चमक के लिए जा रहा है, वे पहले से ही कर रहे हैं, यह सोचते हैं कि एक तरह से समझ में आया। तो यह है कि सिर्फ अपने निष्पक्ष चेतावनी है कि आप इस वीडियो को देख रहे हैं और आप नहीं देखा है संकेत दिए गए वीडियो, यह हो सकता है की तरह अपने सिर पर एक छोटा सा उड़। और इसलिए यह बेहतर हो सकता है इसी क्रम में यह देखने के लिए। इसलिए हम पहले से ही देखा है रास्ता, संकेत के साथ काम करने के लिए जो हम एक घोषित है चर, और फिर हम एक सूचक एक और चर घोषित चर, कि यह करने के लिए अंक। इसलिए हम बनाया है एक एक नाम के साथ चर, हम है एक नाम के साथ एक दूसरे चर बनाया और हम दूसरे चर उस बिंदु कि पहली बार में। इस तरह की है एक समस्या है, हालांकि, इसकी वजह यह ठीक से पता करने की आवश्यकता है कितना स्मृति हम कर रहे हैं पल की जरूरत जा हमारे कार्यक्रम संकलित किया गया है। ऐसा क्यों? हम नाम के लिए सक्षम होने की जरूरत है, क्योंकि या संभव चर के सभी की पहचान हम मुठभेड़ हो सकता है। हम हो सकता है कि एक सरणी हो सकता है जानकारी का एक बहुत धारण करने में सक्षम, लेकिन यह अभी भी नहीं है पर्याप्त बिल्कुल सटीक। क्या हम नहीं जानते हैं, तो क्या हम कोई विचार है कितना हम समय संकलन की आवश्यकता होगी? या फिर क्या हमारे कार्यक्रम होगा यदि एक बहुत लंबे समय के लिए चला, विभिन्न उपयोगकर्ता को स्वीकार डेटा, और हम नहीं कर सकते वास्तव में हम कर रहे हैं कि क्या अनुमान 1,000 इकाइयों की जरूरत के लिए जा रहे हैं? यह हम कर सकते हैं की तरह नहीं है कमांड लाइन पर कहना कितने आइटम दर्ज क्या आप की आवश्यकता होगी लगता। अच्छा है कि अनुमान है कि गलत क्या है? गतिशील स्मृति आबंटन एक तरह से हमें रास्ता अनुमति देता है इस विशेष समस्या निजात पाने के लिए। और वैसे भी यह करता है संकेत का उपयोग कर रहा है। हम संकेत करने के लिए उपयोग कर सकते हैं गतिशील के लिए उपयोग हो है कि आवंटित स्मृति, स्मृति अपने कार्यक्रम के रूप में आवंटित चल रहा है। यह संकलन समय पर आवंटित नहीं कर रहा है। जब आप गतिशील आवंटित स्मृति यह एक पूल से आता है स्मृति के ढेर के रूप में जाना जाता है। हमने इससे पहले सभी स्मृति पाठ्यक्रम में साथ काम कर रहा एक पूल से आ गया है स्मृति के ढेर के रूप में जाना जाता है। एक अच्छा तरीका है आम तौर पर करने के लिए mind-- और इस नियम में रखना हमेशा सच नहीं होता है लेकिन बहुत ज्यादा लगभग हमेशा true-- किसी भी है कि रखती है बार जब आप एक चर नाम दे शायद ढेर पर रहता है। और किसी भी समय आप नहीं करते एक चर एक नाम देना, आप गतिशील स्मृति के साथ क्या कर सकते हैं जो आवंटन, यह ढेर पर रहता है। अब मैं एक तरह से इस के रूप में प्रस्तुत कर रहा हूँ स्मृति के इन दो पूल है कि अगर वहाँ। लेकिन अगर आप यह देखा हो सकता है आम तौर पर है, जो आरेख, का प्रतिनिधित्व क्या स्मृति की तरह लग रहा है और हम सब के बारे में देखभाल करने के लिए नहीं जा रहे हैं ऊपर और नीचे सामान। क्या हम देखभाल के बारे में यह हिस्सा है यहां बीच, ढेर और ढेर। आप से देख सकते हैं इस चित्र में देख रहे हैं, ये वास्तव में दो नहीं हैं स्मृति के अलग-अलग पूल। यह स्मृति का एक साझा पूल है जहां आप इस दृश्य में, शुरू आप नीचे से शुरू और भरना शुरू ढेर के साथ नीचे, और आप से शीर्ष पर शुरू और भरना शुरू ढेर के साथ ऊपर से नीचे। लेकिन यह सच है एक ही पूल, यह सिर्फ है अलग अलग स्थानों, विभिन्न स्थानों स्मृति में आवंटित किए जा रहे हैं कि। और आप से बाहर चला सकते हैं या तो होने से स्मृति ढेर सभी रास्ते जाओ नीचे करने के लिए, या ढेर, शीर्ष करने के लिए सभी रास्ते जाओ या ढेर और ढेर होने एक दूसरे के खिलाफ पूरा। उन की सभी शर्तों को हो सकता है कि अपने कार्यक्रम का कारण स्मृति से बाहर चलाने के लिए। इसलिए इस बात का ध्यान रखें। हम के बारे में बात करते हैं ढेर और ढेर हम वास्तव में के बारे में बात कर रहे हैं स्मृति का एक ही सामान्य हिस्सा है, बस कि स्मृति के विभिन्न भागों। तो हम गतिशील कैसे मिलता है पहली जगह में स्मृति आवंटित? हमारे कार्यक्रम प्राप्त करता है कैसे यह चल रहा है के रूप में स्मृति? खैर सी नामक एक समारोह में प्रदान malloc, स्मृति संभाजक, जो आप के लिए एक फोन करना है, और आप में पारित कितने आप चाहते हैं कि स्मृति के बाइट्स। अपने कार्यक्रम चल रहा है, तो अगर और आप एक पूर्णांक क्रम चाहते हैं, आप में से चार बाइट्स Mallock सकता है स्मृति, malloc चार कोष्ठक। Mallock के माध्यम से जाना होगा ढेर के माध्यम से देख, हम गतिशील रहे हैं, क्योंकि स्मृति का आवंटन और यह आप के लिए वापस आ जाएगी कि स्मृति के लिए एक सूचक। यह आपको लगता है कि memory-- देना नहीं है यह एक नाम देना नहीं है, यह आप इसे करने के लिए एक संकेत देता है। फिर मैंने कहा क्यों और इसलिए है कि यह शायद करने के लिए महत्वपूर्ण है कि संकेत दिए गए वीडियो देख चुके हैं हम इस में बहुत दूर पाने से पहले। तो malloc जा रहा है एक सूचक तुम वापस दे। Mallock आप किसी भी नहीं दे सकते हैं स्मृति आप बाहर चला गया है, क्योंकि यह एक शून्य सूचक तुम वापस दे देंगे। आप हम क्या होता है अगर याद है कोशिश करते हैं और एक शून्य सूचक भिन्नता? हम सही, एक SEG गलती पीड़ित हैं? यही कारण है कि शायद अच्छा नहीं है। तो हर बार जब आप एक फोन करना हमेशा, हमेशा आप malloc के लिए जांच की जरूरत है या नहीं, यह तुम वापस रिक्त है दिया सूचक। अगर ऐसा है, तो आप अपने कार्यक्रम को समाप्त करने की जरूरत है आप भिन्नता कोशिश करते हैं और क्योंकि अगर आप जा रहे हैं शून्य सूचक विखंडन दोष पीड़ित करने के लिए और अपने कार्यक्रम है वैसे भी दुर्घटना के लिए जा रहा है। तो कैसे स्थिर रुप से हम करते हैं एक पूर्णांक प्राप्त? पूर्णांक एक्स। हम शायद किया है कि समय का एक गुच्छा, है ना? यह कहा जाता है एक चर बनाता है ढेर पर रहता है कि एक्स। कैसे हम गतिशील एक पूर्णांक प्राप्त करते हैं? इंटरनैशनल स्टार पिक्सल malloc 4 के बराबर होती है। या अधिक उचित हम int स्टार पिक्सल कह सकता हूँ , पूर्णांक के malloc आकार के बराबर होती है बस कुछ कम फेंकने के लिए हमारे कार्यक्रम के आसपास जादुई संख्या। यह हमारे लिए प्राप्त करने के लिए जा रहा है ढेर से स्मृति के चार बाइट्स, और सूचक हम मिल इसे वापस करने के लिए पिक्सल कहा जाता है। और फिर हम है बस के रूप में हम पहले किया कर सकते हैं पिक्सल भिन्नता को कि स्मृति का उपयोग। हम कैसे उपयोगकर्ता से एक पूर्णांक प्राप्त करते हैं? हम int x पूर्णांक मिल के बराबर होती है कह सकते हैं। यही कारण है कि बहुत सीधा है। हम एक सरणी बनाने के लिए चाहते हैं, तो क्या के ढेर पर रहते हैं कि मंगाई x? उस नाम है stack_array-- फ्लोट हमारे array-- वर्ग कोष्ठक एक्स की। यही कारण है कि हमें एक सरणी के लिए पैदा करेगा के ढेर पर रहते हैं कि मंगाई x। हम मंगाई की एक सरणी बना सकते हैं वह भी, ढेर पर रहता है। वाक्य रचना एक लग सकता है अधिक बोझिल थोड़ा लेकिन हम नाव कह सकते हैं स्टार heap_array के बराबर होती है malloc एक्स बार नाव के आकार। मैं पकड़ करने के लिए पर्याप्त कमरे की जरूरत एक्स चल बिन्दु मूल्यों। तो मैं 100 की जरूरत है कहना तैरता है, या 1,000 मंगाई। तो उस मामले में यह होगा 100 मंगाई के लिए 400 बाइट्स, या 1,000 मंगाई के लिए 4,000 बाइट्स, प्रत्येक नाव तक ले जाता है क्योंकि अंतरिक्ष के चार बाइट्स। यह करने के बाद मैं उपयोग कर सकते हैं heap_array पर वर्ग कोष्ठक सिंटेक्स। बस मैं stack_array पर होगा के रूप में, मैं व्यक्तिगत रूप से उसके तत्वों का उपयोग कर सकते हैं का उपयोग कर heap_array शून्य, heap_array है। लेकिन हम ऐसा कर सकते हैं कारण याद क्योंकि सी में एक सरणी के नाम वास्तव में करने के लिए एक सूचक है उस सरणी का पहला तत्व। हम एक घोषणा कर रहे हैं कि इस तथ्य तो यहां ढेर पर तैरता की सरणी वास्तव में थोड़ा भ्रामक है। हम वास्तव में कर रहे हैं वहाँ कोड की दूसरी पंक्ति यह भी का एक हिस्सा के लिए एक सूचक बनाने हम तो साथ कुछ काम करना है कि स्मृति। यहाँ बड़ी समस्या के साथ है गतिशील हालांकि स्मृति आवंटित, यह सच है और इस वजह से है कुछ अच्छी आदतें विकसित करने के लिए महत्वपूर्ण जब आप इसके साथ काम कर रहे हैं। स्थिर रुप से घोषित विपरीत स्मृति, अपनी स्मृति स्वचालित रूप से करने के लिए नहीं लौटा है अपने कार्य किया जाता है जब सिस्टम। हम मुख्य है, और यदि हां मुख्य एक समारोह कॉल च, खत्म च यह जब कर रहा है जो कुछ भी और कार्यक्रम के नियंत्रण के लिए रिटर्न पीठ, मुख्य करने के लिए सभी स्मृति की इस्तेमाल किया है कि च वापस दे दिया जाता है। यह फिर से इस्तेमाल किया जा सकता कुछ अन्य प्रोग्राम के द्वारा, या कुछ अन्य समारोह है कि मुख्य में बाद में बुलाया जाता है। यह फिर से एक ही है कि स्मृति से अधिक उपयोग कर सकते हैं। यदि आप गतिशील हालांकि स्मृति का आवंटन आप स्पष्ट रूप से बताने के लिए है आप इसके साथ कर रहे हैं कि प्रणाली। यह जो कर सकता है, यह आप के लिए पर पकड़ लेंगे आप बाहर चलने के लिए एक समस्या के लिए नेतृत्व स्मृति की। और वास्तव में हम कभी कभी का उल्लेख एक स्मृति रिसाव के रूप में यह करने के लिए। और कभी कभी इन स्मृति लीक वास्तव में वास्तव में विनाशकारी हो सकता है प्रणाली के प्रदर्शन के लिए। यदि आप एक लगातार इंटरनेट उपयोगकर्ता हैं आप कुछ वेब ब्राउज़र का उपयोग हो सकता है और मैं यहाँ नाम का नाम नहीं होगा, लेकिन कुछ वेब ब्राउज़र वहाँ से बाहर हैं वास्तव में रखने के लिए कुख्यात रहे हैं कि तय नहीं मिलता है कि स्मृति लीक। और आप अपने ब्राउज़र खुला छोड़ दें समय की एक बहुत ही लंबी अवधि के लिए, दिन और दिनों या हफ्तों के लिए, आप कभी कभी अपने सिस्टम सूचना है कि हो सकता है वास्तव में धीरे-धीरे, वास्तव में चल रहा है। और उस के लिए कारण यह है कि ब्राउज़र, स्मृति आवंटित की गई है लेकिन उसके बाद सिस्टम नहीं बताया कि यह इसके साथ हो चुका है। और इतना है कि कम स्मृति के पत्तों अपने अन्य कार्यक्रमों के सभी के लिए उपलब्ध आप कर रहे हैं, क्योंकि साझा करने के लिए कि वेब ब्राउज़र leaking-- कार्यक्रम स्मृति लीक कर रहा है। हम वापस स्मृति दे कर कैसे हम इसके साथ कर रहे है? खैर सौभाग्य से यह एक है यह करने के लिए बहुत ही आसान तरीका। हम सिर्फ यह मुक्त। मुक्त नामक एक समारोह नहीं है, यह स्मृति के लिए एक सूचक को स्वीकार करता है और हम जाने के लिए अच्छे हैं। तो चलो हम में हैं, हम कहते हैं हमारे कार्यक्रम के बीच, हम 50 अक्षर malloc करना चाहते हैं। हम कर सकते हैं कि एक सरणी malloc करना चाहते हैं 50 अक्षर धारण करने में सक्षम। और हम वापस करने के लिए एक सूचक मिलता है जब कि, कि सूचक के नाम शब्द है। हम हम कर रहे हैं जो कुछ भी शब्द के साथ क्या करने जा रहे हैं, और फिर हम कर रहे हैं जब हम सिर्फ यह मुक्त किया। और अब हम उन 50 लौट आए हैं वापस व्यवस्था करने के लिए स्मृति के बाइट्स। कुछ अन्य समारोह के लिए उन्हें इस्तेमाल कर सकते हैं। हम एक पीड़ित के बारे में चिंता करने की जरूरत नहीं है स्मृति रिसाव हम शब्द को मुक्त किया है। हम वापस स्मृति दिया है, इसलिए हम उसके साथ काम कर रहे हैं। तो तीन हैं कि ऐसा करना चाहिए सुनहरा नियम आप कर रहे हैं, जब भी ध्यान में रखा जाना गतिशील स्मृति आवंटन malloc साथ। स्मृति के प्रत्येक ब्लॉक कि आप malloc मुक्त कर दिया जाना चाहिए अपने कार्यक्रम से पहले पूरा चल रहा है। अब फिर से, उपकरण में या में आईडीई इस तरह की वैसे भी आप के लिए होता है you-- जब यह वैसे भी कुछ नहीं होगा अपने कार्यक्रम समाप्त हो जाता है जब, सभी स्मृति में जारी किया जाएगा। लेकिन यह आम तौर पर अच्छा कोडिंग है अभ्यास हमेशा के लिए, जब आप कर रहे, आप mallocd है क्या मुक्त। उस ने कहा, केवल बातें है कि आप mallocd मुक्त किया जाना चाहिए है। आप स्थिर रुप से घोषणा एक पूर्णांक, पूर्णांक एक्स सेमी कॉलन, कि ढेर पर रहता है, तो आप तब x मुक्त करने के लिए नहीं करना चाहती। तुम हो तो यह है कि केवल बातें mallocd मुक्त किया जाना चाहिए। और अंत में, दो बार नहीं मुक्त कुछ करो। यही कारण है कि करने के लिए नेतृत्व कर सकते हैं एक और अजीब स्थिति है। आप है कि इतना सब कुछ mallocd मुक्त किया गया है। आप है कि केवल बातें malloc मुक्त किया जाना चाहिए। और दो बार नहीं मुक्त कुछ करो। तो चलो यहाँ एक उदाहरण के माध्यम से चलते हैं कुछ गतिशील आवंटित क्या की स्मृति मिश्रित तरह लग सकता है कुछ स्थिर स्मृति के साथ में। यहाँ क्या हो सकता है? आप का पालन कर सकते हैं देखें साथ में और क्या लगता है हम जाने के रूप में होने जा रहा कोड के इन सभी लाइनों के माध्यम से। इसलिए हम पूर्णांक मीटर कहते हैं। यहाँ क्या होता है? वैसे यह बहुत सीधा है। मैं एम नामक एक पूर्णांक चर पैदा करते हैं। मैं इसे हरी रंग कि रंग है, क्योंकि मैं बात कर रहा हूँ, जब कि मैं का उपयोग के बारे में पूर्णांक चर। यह एक बॉक्स है। यह आप कर सकते मीटर कहा जाता है, और है इसके अंदर दुकान पूर्णांकों। मैं तो एक पूर्णांक स्टार क्या कहते हैं? अच्छा है कि बहुत समान है। मैं एक बॉक्स एक बुलाया पैदा कर रहा हूँ। इसे धारण पूर्णांक के लिए सक्षम है सितारों, पूर्णांकों को संकेत दिए। इसलिए मुझे लगता है के रूप में अच्छी तरह से इसे हरी-ish रंग कर रहा हूँ। मुझे लगता है यह कुछ है पता एक पूर्णांक के साथ क्या करना, लेकिन यह कोई पूर्णांक नहीं ही है। लेकिन यह बहुत ज्यादा एक ही विचार है। मैं एक बॉक्स बना लिया है। ये सही दोनों अब ढेर पर रहते हैं। मैं उन दोनों को नाम दिए गए हैं। पूर्णांक स्टार ख पूर्णांक के malloc आकार के बराबर होती है। यह एक थोड़ा मुश्किल हो सकता है। एक दूसरा ले लो और आप के बारे में क्या लगता है इस चित्र पर होने की उम्मीद है। पूर्णांक स्टार ख पूर्णांक के malloc आकार के बराबर होती है। वैसे यह सिर्फ एक बॉक्स नहीं बना है। यह वास्तव में दो बक्से पैदा करता है। और यह यह भी स्थापित करता है, संबंधों एक रिश्ते में एक बिंदु। हम एक ब्लॉक आवंटित किया है ढेर पर स्मृति की। नोटिस शीर्ष सही बॉक्स कि एक नाम नहीं है। हम यह mallocd। यह ढेर पर मौजूद है। लेकिन बी एक नाम है। यह बी नामक एक सूचक चर है। यही कारण है कि ढेर पर रहता है। तो यह स्मृति का एक टुकड़ा है कि एक दूसरे के लिए अंक। ख पता होता है स्मृति की है कि ब्लॉक की। यह अन्यथा एक नाम नहीं है। लेकिन यह इसके लिए अंक। इसलिए हम पूर्णांक स्टार ख के बराबर होती है जब कहते हैं पूर्णांक के malloc आकार, सही है कि वहाँ, पर popped कि कि तीर वहाँ दाईं ओर, कि पूरी बात, मैं यह प्रकट होगा फिर, क्या होता है। कि सब के सब में क्या होता है कोड की है कि एकल लाइन। अब हम थोड़ा अधिक मिलेगा फिर से सीधा। एक एम्परसेंड मीटर के बराबर होती है। आप क्या एक याद करो एम्परसेंड मीटर है के बराबर होती है? अच्छा है कि एक मीटर का पता हो जाता है। या, और अधिक रेखचित्र डाल मीटर करने के लिए एक अंक। एक बी के बराबर होती है। ठीक है तो यहाँ एक और एक है। एक ख के बराबर होती है। क्या होने जा रहा है आरेख इस समय के लिए? अच्छा है कि याद असाइनमेंट ऑपरेटर काम करता है पर मूल्य बताए द्वारा सही बाईं तरफ के मूल्य के लिए। मीटर करने के लिए इतनी के बजाय एक ओर इशारा करते हुए, एक अब बी अंक है कि एक ही जगह पर बताते हैं। एक, एक बी बिंदु नहीं है जहां बी अंक बताते हैं। एक उठाई कि ख के लिए तो होगा एक एम्परसेंड ख के बराबर होती है किया गया है। लेकिन बजाय एक बस ख के बराबर होती है इसका मतलब है कि और ख अब कर रहे हैं , एक ही पते पर क्योंकि इशारा करते हुए ख के अंदर सिर्फ एक पता है। और अब एक के अंदर एक ही पता है। मीटर शायद, 10 के बराबर होती है सबसे सरल बात हम एक छोटा सा में किया है। बॉक्स में 10 रखो। स्टार ख मीटर के बराबर होती है प्लस 2 से याद करते हैं हमारे संकेत वीडियो क्या स्टार ख का मतलब है। हम भिन्नता ख और डाल करने के लिए जा रहे हैं कि स्मृति स्थान में कुछ मूल्य। इस मामले में 12। इसलिए जब हम में से एक बिंदु भिन्नता हम सिर्फ तीर नीचे की यात्रा को याद करते हैं। या दूसरे शब्दों में कहें, हम कि स्मृति पता करने के लिए जाना और हम इसे किसी तरह से हेरफेर। हम वहाँ में कुछ मान रखा। इस मामले स्टार ख में मीटर के बराबर होती है प्लस 2 बस है चर के लिए जाना है, ख द्वारा उठाई स्मृति के लिए जाना है, ख द्वारा उठाई और 12, वहाँ में मीटर प्लस 2 डाल दिया। अब मैं ख मुक्त। मैं b मुक्त तो क्या होता है? मैं मुक्त साधन क्या कहा याद रखें। मैं b मुक्त जब मैं क्या कह रहा हूँ? मैं उसके साथ काम कर रहा हूँ, है ना? मैं अनिवार्य स्मृति छोड़ देना। मैं इस प्रणाली के लिए इसे वापस दे। मैं यह अब और नहीं है की जरूरत नहीं क्या मैं ठीक है, उन्हें बता रहा हूँ? अब मैं कहना है कि अगर स्टार एक 11 आप शायद कर सकते हैं के बराबर होती है पहले से ही खराब है कि कुछ बताने ठीक है, यहाँ होने जा रहा है? और मुझे लगता है मुझे लगता है कि शायद कोशिश की यदि वास्तव में विखंडन दोष भुगतना होगा। क्योंकि अब, हालांकि स्मृति के पहले से है कि हिस्सा मैं था कि कुछ इस बिंदु पर करने के लिए उपयोग, अब मैं स्मृति पहुँचने हूँ कि मुझे का उपयोग करने के लिए कानूनी नहीं है। और जैसा कि हम शायद होगा हम स्मृति का उपयोग करते हैं, तो याद हम स्पर्श करने की अपेक्षा नहीं कर रहे हैं कि, कि सबसे आम कारण है एक विभाजन की गलती। और तो मेरे कार्यक्रम मैं ऐसा करने की कोशिश करता है, तो दुर्घटना होगा। तो फिर यह अच्छा पाने के लिए एक अच्छा विचार है अभ्यास और अच्छी आदतों जमा हुआ malloc और नि: शुल्क के साथ काम करते हैं, इसलिए यदि आप विभाजन पीड़ित नहीं है कि आप का उपयोग करें, और उस दोष आपके गतिशील आवंटित स्मृति जिम्मेदारी से। मैं डौग लॉयड हूँ इस CS50 है।