[موسیقی]
>> داگ لوید: OK بنابراین یک پیشنهاد قبل از شروع در اینجا.
اگر شما این ویدئو را تماشا نیست در علائم شما ممکن است بخواهید برای انجام این کار است.
از آنجا که این فیلم یکی دیگر از روش کار با اشاره گر.
>> بنابراین آن را به صحبت در مورد برخی از مفاهیم
که ما در پوشش علائم ویدئو، و ما
رفتن به پوشاندن آنها در حال حاضر، فرض کنید که آنها در حال حاضر
مرتب کردن بر اساس درک شده است.
به طوری که فقط هشدار خود را که اگر شما در حال دیدن این فیلم
و شما را دیده اند، نه فیلم اشاره گر، ممکن است نوعی از
پرواز بیش از سر خود را کمی.
و پس از آن ممکن است بهتر باشد به تماشای آن در آن منظور.
>> بنابراین ما در حال حاضر دیده یک راه به کار با اشاره گرها،
که است که ما اعلام متغیر، و سپس ما
اعلام متغیر دیگر، یک اشاره گر متغیر، که اشاره به آن است.
بنابراین ما ایجاد کرده اید متغیر را با یک نام، ما
یک متغیر دوم را با یک نام، و و ما اشاره است که متغیر دوم
در که برای اولین بار.
این نوع از یک مشکل هر چند، به دلیل آن
ما را ملزم به دقیقا می دانند که چه مقدار حافظه ما
نیاز به رفتن به لحظه برنامه های ما وارد شده است.
>> چرا چنین است؟
از آنجا که ما باید قادر به نام یا شناسایی تمام متغیرهای ممکن
ما ممکن است روبرو می شوند.
ما ممکن است یک آرایه است که ممکن است داشته قادر به نگه داشتن بسیاری از اطلاعات،
اما هنوز هم نمی دقیقا به اندازه کافی دقیق.
اگر ما نمی دانیم، چه می شود اگر ما هیچ ایده
چقدر ما به در زمان کامپایل نیاز دارید؟
و یا اگر برنامه های ما خواهد اجرا برای یک مدت واقعا طولانی،
پذیرش کاربران مختلف داده ها، و ما نمی توانیم واقعا
آیا ما در حال برآورد نیاز به رفتن به 1،000 واحد؟
>> آن را دوست ندارم ما می توانیم می گویند در خط فرمان
چگونه بسیاری از موارد وارد کنید شما فکر می کنم شما نیاز دارید.
خب چه می شود اگر که حدس اشتباه است؟
تخصیص حافظه پویا مرتب سازی بر ما اجازه می دهد تا راه
برای حل این مشکل خاص است.
و راه آن را به با استفاده از اشاره گر.
>> ما می توانید اشاره گر به استفاده از دسترسی به صورت پویا
حافظه اختصاص داده شده، حافظه است که اختصاص داده به عنوان برنامه خود را در حال اجرا است.
آن را در زمان کامپایل اختصاص داده است.
هنگامی که شما به صورت پویا تخصیص حافظه آن را از یک استخر می آید
از حافظه به عنوان پشته شناخته شده است.
پیش از تمام حافظه ام کار با در این دوره
شده است که از یک استخر حافظه به عنوان پشته شناخته شده است.
یک راه خوب برای به طور کلی در حکومت mind-- و این را
همیشه نمی صادق است، اما بسیار تقریبا
همیشه نگه می دارد این است که هر true-- زمان نام متغیر آن را به شما می دهد
احتمالا در پشته زندگی می کند.
و هر زمان به شما نمی کنند به یک متغیر یک نام،
که شما می توانید با حافظه پویا تخصیص، آن را در پشته زندگی می کند.
>> در حال حاضر من از ارائه این عنوان اگر این دو استخر از حافظه وجود دارد.
اما ممکن است شما دیده می شود این نمودار، که به طور کلی
یک نماینده از چه حافظه نظر می رسد،
و ما قصد داریم در مورد مراقبت از همه مسائل در بالا و پایین.
آنچه ما در مورد مراقبت از این بخش در است وسط در اینجا، پشته و پشته.
همانطور که می بینید توسط به دنبال در این نمودار،
این در واقع دو نیست استخرهای مجزا از حافظه است.
این یکی مشترک از حافظه است که در آن شما شروع، در این تصویری
شما در پایین شروع و شروع به پر کردن
از پایین با پشته، و شما شروع در بالا و شروع به پر کردن تا
از بالا به پایین با پشته.
اما واقعا است همان استخر، آن را فقط
نقاط مختلف، مکان های مختلف در حافظه که در حال اختصاص داده است.
و شما می توانید از اجرا حافظه با هم داشتن
پشته به تمام راه به پایین، و یا
پشته به تمام راه را به بالا، و یا داشتن heap و stack
ملاقات در برابر یکدیگر.
همه کسانی که می تواند شرایط که باعث برنامه های خود را
برای اجرا از حافظه است.
طوری نگه دارید که در ذهن است.
هنگامی که ما در مورد صحبت پشته و پشته
ما واقعا در مورد صحبت کردن به طور کلی همان تکه از حافظه، فقط
قسمت های مختلف که حافظه است.
>> پس چگونه ما به صورت پویا گرفتن حافظه اختصاص داده شده در وهله اول؟
چگونه برنامه ما را دریافت کنید حافظه به عنوان آن در حال اجرا؟
خب C یک تابع به نام فراهم می کند از malloc، تخصیص حافظه، که
شما یک تماس را به، و به شما منتقل در چگونه بسیاری از بایت از حافظه است که شما می خواهید.
بنابراین اگر اجرای برنامه و شما می خواهید یک زمان اجرا عدد صحیح،
شما ممکن است چهار بایت از mallock حافظه، از malloc پرانتز چهار.
>> mallock را از طریق رفتن به دنبال از طریق پشته،
چرا که ما به صورت پویا هستید تخصیص حافظه،
و آن را به شما بازگشت اشاره گر به آن حافظه است.
آن را به شما نمی دهد که حافظه آن آن یک نام را نمی دهد،
آن را به شما می دهد یک اشاره گر به آن است.
و به همین دلیل دوباره به من گفت که این مهم به شاید
این ویدئو را تماشا کرده اند اشاره گر قبل از ما بیش از حد دریافت به این.
بنابراین malloc را به شما یک اشاره گر است.
>> اگر mallock می تواند به شما هر را حافظه به دلیل از شما اجرا از این،
آن را به شما یک اشاره گر تهی است.
آیا شما به یاد داشته باشید چه اتفاقی می افتد اگر ما امتحان کنید و ارجاع به یک اشاره گر خالی؟
ما رنج می برند گسل SEG، درست است؟
که احتمالا خوب نیست.
>> بنابراین هر بار که شما یک تماس به شما malloc همیشه، همیشه
نیاز به بررسی اینکه آیا یا نه اشاره گر آن به شما تماس تهی است.
اگر از آن است، شما نیاز به پایان دادن به برنامه خود را چرا که اگر شما سعی می کنید و ارجاع
اشاره گر تهی شما در حال رفتن به رنج می برند گسل تقسیم بندی
و برنامه های خود را است رفتن به سقوط به هر حال.
بنابراین ما چگونه استاتیک به دست آوردن یک عدد صحیح؟
>> نوع int x.
ما احتمالا انجام داده ام که یک دسته از بار، درست است؟
این یک متغیر به نام ایجاد X که بر روی پشته زندگی می کند.
چگونه ما به صورت پویا یک عدد صحیح به دست آوردن؟
INT پیکسل ستاره برابر از malloc 4.
>> یا بیشتر مناسب ما می خواهم بگویم پیکسل ستاره بین المللی
برابر اندازه از malloc از نوع int، فقط به پرتاب برخی از کمتر
اعداد سحر و جادو در سراسر برنامه های ما.
این است که برای به دست آوردن برای ما چهار بایت از حافظه پشته،
و اشاره گر ما برگشت به آن را به نام پیکسل.
و پس از آن فقط به عنوان ایم ما قبلا انجام داده
می توانید ارجاع پیکسل به که حافظه دسترسی داشته باشید.
چگونه یک عدد صحیح را از کاربر دریافت کنم؟
می توان گفت از نوع int x برابر گرفتن نوع int است.
این خیلی سر راست است.
اگر که می خواهید برای ایجاد یک آرایه از شناور که بر روی پشته زندگی می کنند X؟
شناور stack_array-- که نام این از آرایه ما براکت x است.
که برای ما یک آرایه ایجاد خواهد شد از شناور که بر روی پشته زندگی می کنند X.
ما می توانیم یک آرایه از شناور ایجاد که زندگی می کند در پشته، TOO.
نحو ممکن است یک نگاه کمی دست و پا گیر،
اما ما می توانیم شناور می گویند heap_array ستاره برابر
بار از malloc X اندازه شناور.
من نیاز به اتاق به اندازه کافی برای نگه داشتن X شناور ارزش نقطه.
بنابراین می گویند من نیاز به 100 شناور، شناور خطوط و یا 1،000.
بنابراین در این مورد از آن خواهد بود 400 بایت برای 100 شناور،
و یا 4،000 بایت برای 1،000 شناور، زیرا هر یک از شناور طول می کشد تا
چهار بایت از فضا.
>> پس از انجام این من می توانم استفاده استفاده از دستور براکت در heap_array.
همانطور که من را بر روی stack_array، من می توانید آن را به صورت جداگانه دسترسی به عناصر
با استفاده از heap_array صفر، یک heap_array.
اما به یاد دلیل ما می توانیم که این دلیل است که نام یک آرایه در C
واقعا یک اشاره گر به اولین عنصر آرایه است.
بنابراین این واقعیت است که ما در حال اعلام یک مجموعه ای از شناور بر روی پشته در اینجا
است که در واقع کمی گمراه کننده.
ما واقعا در می خط دوم کد وجود دارد
همچنین ایجاد یک اشاره گر به یک تکه از حافظه است که ما پس از آن برخی از کار با انجام.
>> در اینجا مشکل بزرگ با این پویا اختصاص داده حافظه هر چند،
و این است که چرا آن را واقعا مهم برای توسعه برخی از عادات خوب
زمانی که شما کار با آن.
بر خلاف آماری اعلام کرد حافظه، حافظه خود را
به طور خودکار به بازگشت نیست سیستم زمانی که عملکرد خود را انجام شده است.
بنابراین اگر ما اصلی، و اصلی یک تابع فراخوانی
F، وقتی f پس از اتمام هر چه آن را انجام و کنترل برنامه را برمی گرداند
برگشت به بخش اصلی، همه از حافظه که f استفاده شده است تماس داده شده است.
می توان آن را دوباره مورد استفاده قرار توسط برخی از برنامه های دیگر،
و یا برخی از تابع دیگر که می شود بعد از آن در اصلی به نام.
می توانید آن را که حافظه همان را دوباره و دوباره استفاده کنید.
>> اگر شما به صورت پویا تخصیص حافظه هر چند
شما باید به صراحت بگویم سیستم است که شما را با آن انجام می شود.
آن را بر روی آن را برای شما نگه دارید، که می تواند منجر به مشکل شما در حال اجرا
از حافظه است.
و در واقع گاهی اوقات مراجعه ما به این به عنوان یک نشت حافظه.
و بعضی اوقات این نشت حافظه در واقع می تواند واقعا ویرانگر باشد
برای عملکرد سیستم.
>> اگر شما یک کاربر اینترنت مکرر شما ممکن است مرورگر وب خاص استفاده کنید،
و من نام نام نیست در اینجا، اما برخی از مرورگرهای وب وجود دارد
که برای بدنام در واقع با داشتن هستند نشت حافظه که ثابت نشده است.
و اگر شما را ترک مرورگر خود را باز برای یک دوره بسیار طولانی از زمان، روز
و روز یا چند هفته، شما گاهی اوقات ممکن است متوجه سیستم شما
در حال اجرا است واقعا، واقعا آرام است.
و دلیل آن این است که مرورگر حافظه اختصاص داده است،
اما پس از آن سیستم گفت که آن را با آن انجام می شود.
و به طوری که برگ حافظه کمتر در دسترس برای همه برنامه های دیگر خود را
به به اشتراک گذاشتن، چون تو leaking-- که مرورگر وب
برنامه نشت حافظه است.
چگونه حافظه ما به تماس زمانی که ما با آن انجام می شود؟
خب خوشبختانه آن را یک راه بسیار آسان برای انجام آن است.
ما فقط آن را آزاد.
یک تابع به نام رایگان وجود دارد، این یک اشاره گر را می پذیرد به حافظه،
و ما خوب به آن بروید.
>> بنابراین اجازه دهید می گویند که ما در حال وسط برنامه ما،
ما می خواهیم به malloc 50 حرف می باشد.
ما می خواهیم به malloc یک آرایه است که می توانید قادر به نگه داشتن 50 حرف می باشد.
و هنگامی که ما یک اشاره گر به که، نام که اشاره گر به کلمه است.
ما هر آنچه را که ما را به انجام با کلمه،
و پس از آن زمانی که ما انجام ما فقط آن را آزاد.
و در حال حاضر ما بازگشت آن 50 بایت حافظه به سیستم.
برخی از عملکرد های دیگر می توانید آنها را استفاده کنید.
ما لازم نیست که به نگرانی در مورد درد و رنج نشت حافظه از آنجا که ما کلمه آزاد شده است.
ما در حافظه داده ام تماس، بنابراین ما در حال کار با انجام آن می.
بنابراین سه وجود دارد قوانین طلایی که باید
در ذهن نگه داشته هر زمان که شما تخصیص حافظه به صورت پویا
با malloc.
هر بلوک از حافظه که شما malloc آزاد باید گردد
قبل از برنامه در حال اجرا پس از اتمام خود را.
در حال حاضر دوباره، در دستگاه و یا در IDE این نوع از برای شما اتفاق می افتد به هر حال
وقتی you-- این به هر حال اتفاق خواهد افتاد هنگامی که برنامه خود را خاتمه یافته است،
تمام حافظه منتشر خواهد شد.
اما آن را به طور کلی خوب برنامه نویسی عمل به همیشه، هنگامی که شما انجام می شود،
رایگان چه شما mallocd اند.
>> که گفت، تنها چیزهایی که شما در mallocd باید آزاد.
اگر شما آماری اعلام عدد صحیح، نوع int x نیمه روده بزرگ،
که زندگی می کند بر روی پشته، شما نمی کنند و سپس می خواهید به رایگان X.
بنابراین تنها چیزهایی که شما را mallocd باید آزاد شود.
>> و در آخر، انجام کاری دو بار رایگان است.
که می تواند منجر وضعیت عجیب و غریب است.
بنابراین همه چیز که شما را mallocd است آزاد شوند.
تنها چیزهایی که شما را از malloc باید آزاد شود.
و انجام کاری دو بار رایگان است.
>> بنابراین اجازه دهید از طریق یک مثال به اینجا بروید از آنچه برخی از پویا اختصاص داده
حافظه ممکن است مانند مخلوط نگاه با برخی از حافظه استاتیک می باشد.
چه چیزی ممکن است در اینجا اتفاق می افتد؟
ببینید اگر شما می توانید به دنبال همراه و حدس بزنید چه چیزی
رفتن به عنوان ما به از طریق تمام این خط کد.
>> بنابراین ما می گویند INT متر.
چه اتفاقی می افتد؟
خب این بسیار ساده است.
من یک متغیر عدد صحیح به نام متر ایجاد کنید.
رنگ آن سبز، چرا که این رنگ است
که من استفاده از زمانی که من صحبت کردن در در مورد متغیر عدد صحیح است.
این یک جعبه است.
آن را به نام متر، و شما می توانید اعداد صحیح اینترنتی داخل آن است.
>> اگر من پس بگو ستاره بین المللی A است؟
خوب است که بسیار مشابه است.
من ایجاد یک جعبه به نام.
آن را قادر به برگزاری INT ستاره ها، اشاره گر به اعداد است.
بنابراین من آن را رنگ آمیزی سبز حرکت است.
>> من می دانم آن را تا به چیزی برای انجام با یک عدد صحیح،
اما آن را یک عدد صحیح نمی شده است.
اما آن را بسیار بسیار همان ایده.
من یک جعبه ایجاد کرده اید.
هر دو از این حق در حال حاضر در پشته زندگی می کنند.
من آنها را هر دو نام داده ام.
>> ستاره بین المللی B برابر اندازه از malloc از نوع int است.
این یکی ممکن است کمی مشکل است.
یک دوم و فکر می کنم در مورد آنچه شما انتظار می رود که در این نمودار اتفاق می افتد.
ستاره بین المللی B برابر اندازه از malloc از نوع int است.
>> خب این نه تنها یک جعبه ایجاد کنید.
این در واقع ایجاد دو جعبه.
و روابط، آن را نیز ایجاد یک نقطه در یک رابطه.
ما یک بلوک اختصاص داده ام حافظه در پشته.
توجه داشته باشید که جعبه سمت راست بالای صفحه وجود دارد یک نام ندارد.
>> ما آن را mallocd.
آن را بر روی پشته وجود دارد.
ولی B یک نام است.
این یک متغیر اشاره گر به نام B است.
که زندگی در پشته.
>> پس از آن یک قطعه از حافظه که اشاره به یکی دیگر.
B شامل آدرس از آن بلوک از حافظه است.
این کار یک نام ندارد در غیر این صورت.
اما آن را به آن اشاره می کند.
بنابراین، هنگامی که ما می گویند ستاره بین المللی B برابر اندازه از malloc از نوع int، که سمت راست وجود دارد،
که فلش است که تا ظهور سمت راست وجود دارد، که همه چیز،
من باید آن را به نظر می رسد دوباره، چه اتفاقی می افتد.
همه از آن اتفاق می افتد در که خط از کد.
در حال حاضر ما کمی بیشتر دریافت کنید دوباره سر راست است.
برابر علامت متر.
آیا شما به یاد چه برابر علامت متر است؟
خوب است که یک می شود آدرس متر است.
و یا قرار دادن بصورت هندسی تر، امتیاز به متر.
>> برابر ب.
OK بنابراین در اینجا یکی دیگر است.
برابر ب.
چه اتفاقی خواهد افتاد به نمودار این زمان؟
>> خوب به یاد دارند که آثار عملگر انتساب
با اختصاص ارزش در راست به ارزش در سمت چپ.
بنابراین به جای یک اشاره به متر، در حال حاضر اشاره به همان جایی که نقطه B.
کند اشاره به B، A امتیاز امتیاز که در آن ب.
>> اگر یک با اشاره به B است که می شده اند برابر علامت ب.
اما به جای آن برابر B فقط بدان معنی است که در حال حاضر و B
اشاره به همان آدرس، به دلیل داخل B فقط یک آدرس است.
و در حال حاضر در داخل یک آدرس همان است.
m برابر با 10، احتمالا ترین چیز ساده
ما را در کمی انجام می شود.
قرار دادن 10 در جعبه.
ستاره B برابر متر به همراه 2، از یاد ما اشاره گر، فیلم و ستاره B به معنی.
ما قصد داریم به ارجاع B قرار داده و برخی از ارزش در آن محل حافظه است.
در این مورد 12.
>> تا زمانی که ما ارجاع یک نقطه از به یاد ما فقط سفر کردن فلش.
یا به عبارت دیگر، ما رفتن به آن آدرس حافظه
و ما آن را در برخی از راه دستکاری.
ما برخی از ارزش در آن وجود دارد قرار داده است.
در این مورد ستاره ب به علاوه 2 برابر متر است که فقط
رفتن به متغیر به اشاره شده توسط B، رفتن به حافظه به اشاره شده توسط B،
قرار داده و به علاوه 2 متر در آن وجود دارد، 12.
>> در حال حاضر من رایگان B.
وقتی که من رایگان B چه اتفاقی می افتد؟
به یاد داشته باشید آنچه که من معنی رایگان است.
چه هستم من گفت وقتی که من رایگان B؟
>> من کار با انجام آن می، درست است؟
من اساسا دهد تا حافظه است.
من آن را به سیستم.
من لازم نیست این دیگر است چه من می گویم، خوب است؟
>> در حال حاضر اگر من می گویم ستاره برابر 11 شما احتمالا می تواند
در حال حاضر که چیزی بد به در حال رفتن به اینجا اتفاق می افتد، درست است؟
و در واقع اگر من سعی کردم که من احتمالا یک گسل تقسیم رنج می برند.
چون در حال حاضر، اگر چه قبلا آن تکه از حافظه
چیزی بود که من تا به حال دسترسی به، در این نقطه
در حال حاضر من دسترسی به حافظه است که است نه قانونی است برای من به دسترسی داشته باشید.
>> و همانطور که ما احتمالا به یاد، زمانی که ما دسترسی به حافظه
که ما قرار نیست به لمس، که شایع ترین علت است
یک تقسیم بندی گسل. و به این ترتیب برنامه من
سقوط اگر من سعی کردم به انجام این کار.
بنابراین دوباره آن را یک ایده خوب برای گرفتن خوب است تمرین و عادات خوب ریشه دوانده
در هنگام کار با malloc و رایگان، به طوری که شما تقسیم بندی رنج می برند نیست
گسل ها، و که شما با استفاده خود را به صورت پویا اختصاص داده
حافظه مسئولانه.
>> من داگ لوید هستم این CS50.