1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Valgrind] 2 00:00:02,000 --> 00:00:05,000 [مقابله Hardison، دانشگاه هاروارد] 3 00:00:05,000 --> 00:00:07,000 این CS50، CS50.TV] 4 00:00:07,000 --> 00:00:10,000 برخی از اشکالات در سخت ترین برنامه های C 5 00:00:10,000 --> 00:00:13,000 بیا از سوء مدیریت از حافظه است. 6 00:00:13,000 --> 00:00:15,000 تعداد زیادی از راه به پیچ تا چیز وجود دارد، 7 00:00:15,000 --> 00:00:17,000 از جمله تخصیص مقدار غلط از حافظه، 8 00:00:17,000 --> 00:00:20,000 فراموش کردن برای مقداردهی اولیه متغیر، 9 00:00:20,000 --> 00:00:23,000 نوشتن قبل یا بعد از پایان یک بافر، 10 00:00:23,000 --> 00:00:25,000 و آزاد چند بار حافظه نگه دارید. 11 00:00:25,000 --> 00:00:28,000 علائم از تصادفات متناوب محدوده 12 00:00:28,000 --> 00:00:30,000 به ارزش های مرموزی رونویسی، 13 00:00:30,000 --> 00:00:34,000 اغلب در مکان ها و زمان های دور از خطا اصلی برداشته است. 14 00:00:34,000 --> 00:00:37,000 ردیابی مشکل مشاهده بازگشت به ریشه و علت زمینه ای 15 00:00:37,000 --> 00:00:39,000 می تواند چالش برانگیز، 16 00:00:39,000 --> 00:00:42,000 اما خوشبختانه یک برنامه مفید به نام Valgrind وجود دارد 17 00:00:42,000 --> 00:00:44,000 است که می تواند تا حد زیادی به کمک انجام دهد. 18 00:00:44,000 --> 00:00:47,000 >> شما یک برنامه تحت Valgrind را قادر می سازد 19 00:00:47,000 --> 00:00:50,000 بررسی گسترده ای از پشته تخصیص حافظه و دسترسی است. 20 00:00:50,000 --> 00:00:53,000 وقتی Valgrind تشخیص مشکل، آن را به شما می دهد فوری، 21 00:00:53,000 --> 00:00:56,000 اطلاعات مستقیم است که اجازه می دهد تا شما را به 22 00:00:56,000 --> 00:00:58,000 آسان تر از پیدا کردن و حل مشکل. 23 00:00:58,000 --> 00:01:01,000 Valgrind همچنین گزارش در مورد مسائل حافظه کمتری مرگبار، 24 00:01:01,000 --> 00:01:04,000 مانند نشت حافظه، تخصیص حافظه پشته، 25 00:01:04,000 --> 00:01:07,000 و فراموش کردن این برنامه رایگان است. 26 00:01:07,000 --> 00:01:10,000 مثل کامپایلر، صدای جرنگ جرنگ، در دیباگر ما، GDB، 27 00:01:10,000 --> 00:01:14,000 Valgrind نرم افزار رایگان است، و آن را بر روی دستگاه نصب شده است. 28 00:01:14,000 --> 00:01:16,000 Valgrind قابل اجرا بر روی اجرایی باینری، 29 00:01:16,000 --> 00:01:20,000 شما نیست. ج. ساعت فایل های کد منبع، 30 00:01:20,000 --> 00:01:23,000 بنابراین مطمئن شوید که شما را وارد یک کپی تا به تاریخ برنامه شما 31 00:01:23,000 --> 00:01:25,000 با استفاده از صدای جرنگ جرنگ. 32 00:01:25,000 --> 00:01:28,000 پس از آن، در حال اجرا برنامه خود را در زیر Valgrind می تواند 33 00:01:28,000 --> 00:01:32,000 به عنوان ساده به به عنوان پیشوند دستور برنامه استاندارد با Valgrind کلمه، 34 00:01:32,000 --> 00:01:35,000 که شروع می شود تا Valgrind اجرا می شود این برنامه در داخل آن است. 35 00:01:35,000 --> 00:01:38,000 هنگام شروع، Valgrind می کند برخی از پیچیده 36 00:01:38,000 --> 00:01:41,000 jiggering به پیکربندی اجرایی برای چک حافظه، 37 00:01:41,000 --> 00:01:44,000 پس از آن می توانید کمی به بالا و در حال اجرا کنند. 38 00:01:44,000 --> 00:01:48,000 این برنامه خواهد شد و سپس به طور معمول اجرا می شود آن را بسیار آهسته تر، 39 00:01:48,000 --> 00:01:52,000 و زمانی که آن را پس از اتمام، Valgrind خلاصه ای از استفاده از حافظه خود را چاپ کنید. 40 00:01:52,000 --> 00:01:58,000 اگر همه به خوبی می رود، آن را به چیزی شبیه به این: 41 00:01:58,000 --> 00:02:01,000 در این مورد، / clean_program 42 00:02:01,000 --> 00:02:04,000 مسیر به این برنامه من می خواهم برای اجرا است. 43 00:02:04,000 --> 00:02:06,000 و در حالی که این یکی هیچ استدلال را ندارد، 44 00:02:06,000 --> 00:02:09,000 اگر آن را به من می خواهم فقط آنها را به رویه در پایان از دستور به طور معمول. 45 00:02:09,000 --> 00:02:12,000 پاک کردن برنامه فقط یک برنامه کمی احمقانه من ایجاد شده است 46 00:02:12,000 --> 00:02:15,000 که بر روی پشته تخصیص فضا برای یک بلوک از نوع داده int، 47 00:02:15,000 --> 00:02:19,000 قرار دادن برخی از ارزش ها در داخل آنها، آزاد و کل بلوک. 48 00:02:19,000 --> 00:02:23,000 این همان چیزی است که شما در حال عکسبرداری برای، بدون خطا و بدون نشت. 49 00:02:23,000 --> 00:02:27,000 >> یکی دیگر از متریک مهم تعداد کل بایت اختصاص داده است. 50 00:02:27,000 --> 00:02:32,000 بسته به نوع برنامه، اگر اعتبارات خود را در مگابایت یا بالاتر هستند، 51 00:02:32,000 --> 00:02:34,000 شما احتمالا در انجام کاری اشتباه است. 52 00:02:34,000 --> 00:02:37,000 آیا شما بی ارزش ذخیره تکراری؟ 53 00:02:37,000 --> 00:02:40,000 آیا شما با استفاده از پشته برای ذخیره سازی، که از آن بهتر خواهد بود به استفاده از پشته؟ 54 00:02:40,000 --> 00:02:43,000 بنابراین، خطاهای حافظه می تواند واقعا بد است. 55 00:02:43,000 --> 00:02:46,000 تر آشکار باعث سقوط های دیدنی و جذاب، 56 00:02:46,000 --> 00:02:49,000 اما حتی پس از آن هنوز هم می تواند با دقت اشاره کردن 57 00:02:49,000 --> 00:02:51,000 آنچه که دقیقا به تصادف منجر شده است. 58 00:02:51,000 --> 00:02:54,000 بیشتر خائنانه، یک برنامه با خطای حافظه 59 00:02:54,000 --> 00:02:56,000 هنوز هم می توانید به پاک کامپایل 60 00:02:56,000 --> 00:02:58,000 و هنوز هم می تواند به درستی کار کند به نظر می رسد 61 00:02:58,000 --> 00:03:01,000 دلیل این که شما موفق به دریافت خوش شانس بیشتر از زمان. 62 00:03:01,000 --> 00:03:04,000 پس از چندین مورد "نتایج موفقیت آمیز،" 63 00:03:04,000 --> 00:03:07,000 شما فقط ممکن است که یک تصادف اتفاق از کامپیوتر فکر می کنم، 64 00:03:07,000 --> 00:03:10,000 اما کامپیوتر هرگز اشتباه است. 65 00:03:10,000 --> 00:03:13,000 >> در حال اجرا Valgrind می تواند به شما کمک کند تا پیگیری علت خطاهای حافظه قابل مشاهده 66 00:03:13,000 --> 00:03:18,000 و همچنین پیدا کردن کمین اشتباهات شما حتی هنوز نمی دانند در مورد. 67 00:03:18,000 --> 00:03:22,000 هر بار Valgrind تشخیص مشکل، آن را چاپ اطلاعات در مورد آنچه در آن مشاهده می باشد. 68 00:03:22,000 --> 00:03:24,000 هر یک از آیتم نسبتا مختصر و مفید - 69 00:03:24,000 --> 00:03:27,000 خط منبع آموزش متخلف، چه مسئله این است که، 70 00:03:27,000 --> 00:03:30,000 و اطلاعات کمی در مورد حافظه درگیر - 71 00:03:30,000 --> 00:03:34,000 اما اغلب این اطلاعات به اندازه کافی برای هدایت توجه خود را به جای حق. 72 00:03:34,000 --> 00:03:37,000 در اینجا یک مثال از Valgrind در حال اجرا در یک برنامه حشره دار 73 00:03:37,000 --> 00:03:40,000 که آیا به عنوان خوانده شده نامعتبر است و از حافظه پشته است. 74 00:03:40,000 --> 00:03:49,000 ما می بینیم که هیچ خطا یا هشدار در تدوین. 75 00:03:49,000 --> 00:03:53,000 آه، آه، خلاصه خطا می گوید که دو اشتباه وجود دارد - 76 00:03:53,000 --> 00:03:56,000 دو بار خوانده شده نامعتبر است از اندازه 4 - بایت، این است که. 77 00:03:56,000 --> 00:04:01,000 هر دو بد می خواند رخ داده در تابع اصلی invalid_read.c، 78 00:04:01,000 --> 00:04:04,000 برای اولین بار در خط 16 و دوم در خط 19. 79 00:04:04,000 --> 00:04:06,000 بیایید نگاهی به کد. 80 00:04:06,000 --> 00:04:11,000 به نظر می رسد مثل اولین تماس به printf تلاش می کند به خواندن یک بین المللی گذشته در پایان از بلوک حافظه ما. 81 00:04:11,000 --> 00:04:13,000 اگر ما به عقب نگاه در خروجی Valgrind، 82 00:04:13,000 --> 00:04:16,000 ما می بینیم که Valgrind به ما گفت که دقیقا. 83 00:04:16,000 --> 00:04:19,000 آدرس ما در حال تلاش برای خواندن شروع می شود 0 بایت 84 00:04:19,000 --> 00:04:22,000 گذشته پایان بلوک اندازه 16 بایت - 85 00:04:22,000 --> 00:04:25,000 چهار 32 بیتی نوع داده int است که ما اختصاص داده شده است. 86 00:04:25,000 --> 00:04:29,000 این است که، آدرس ما در تلاش بودند به خواندن شروع می شود درست در پایان بلوک، 87 00:04:29,000 --> 00:04:32,000 همانگونه که در تماس printf بد ما را ببینید. 88 00:04:32,000 --> 00:04:36,000 در حال حاضر، نامعتبر خوانده شده ممکن است به نظر می رسد مانند که از یک معامله بزرگ، 89 00:04:36,000 --> 00:04:39,000 اما اگر شما با استفاده از این داده ها برای کنترل جریان برنامه های خود را - 90 00:04:39,000 --> 00:04:42,000 به عنوان مثال، به عنوان بخشی از یک اگر بیانیه و یا حلقه - 91 00:04:42,000 --> 00:04:45,000 پس از آن همه چیز سکوت می تواند بد. 92 00:04:45,000 --> 00:04:47,000 سازمان دیده بان چگونه می توانم این برنامه invalid_read اجرا 93 00:04:47,000 --> 00:04:50,000 و هیچ چیز عادی اتفاق می افتد. 94 00:04:50,000 --> 00:04:52,000 ترسناک، متعجب؟ 95 00:04:52,000 --> 00:04:56,000 >> در حال حاضر، اجازه دهید نگاهی به انواع برخی از اشتباهات است که شما ممکن است در کد شما روبرو می شوند، 96 00:04:56,000 --> 00:04:59,000 و خواهیم دید که چقدر Valgrind آنها را تشخیص. 97 00:04:59,000 --> 00:05:01,000 ما فقط دیدم یک نمونه از invalid_read، 98 00:05:01,000 --> 00:05:04,000 بنابراین در حال حاضر را بررسی کنید invalid_write به شما اجازه می دهد تا. 99 00:05:04,000 --> 00:05:09,000 باز هم، هیچ خطا یا هشدار در تدوین است. 100 00:05:09,000 --> 00:05:12,000 خوب، Valgrind می گوید که دو خطا در این برنامه وجود دارد - 101 00:05:12,000 --> 00:05:15,000 و invalid_write و invalid_read. 102 00:05:15,000 --> 00:05:18,000 بیایید از این کد. 103 00:05:18,000 --> 00:05:21,000 به نظر می رسد مثل ما رو به عنوان مثال کلاسیک strlen به علاوه یک اشکال است. 104 00:05:21,000 --> 00:05:24,000 کد می کند بایت اضافی از فضا malloc نیست 105 00:05:24,000 --> 00:05:26,000 برای کاراکتر / 0، 106 00:05:26,000 --> 00:05:30,000 بنابراین، هنگامی که STR کپی رفت و آن را در ssubstrlen نوشتن "cs50 سنگ!" 107 00:05:30,000 --> 00:05:33,000 1 بایت گذشته پایان بلوک ما نوشت. 108 00:05:33,000 --> 00:05:36,000 invalid_read می آید وقتی که ما را به تماس ما را به printf است. 109 00:05:36,000 --> 00:05:40,000 Printf به پایان می رسد تا خواندن حافظه نامعتبر است هنگامی که آن را می خواند / 0 از شخصیت ها 110 00:05:40,000 --> 00:05:43,000 به عنوان آن را در انتهای این رشته E به نظر می رسد آن را چاپ است. 111 00:05:43,000 --> 00:05:45,000 اما هیچ یک از این فرار Valgrind. 112 00:05:45,000 --> 00:05:48,000 ما می بینیم که در آن گرفتار invalid_write به عنوان بخشی از نسخه خ 113 00:05:48,000 --> 00:05:51,000 در خط 11 از اصلی و invalid_read بخشی از printf است. 114 00:05:51,000 --> 00:05:54,000 سنگ در Valgrind. 115 00:05:54,000 --> 00:05:57,000 باز هم، این ممکن است به نظر می رسد مانند یک معامله بزرگ است. 116 00:05:57,000 --> 00:06:00,000 ما می توانید این برنامه را بارها و بارها اجرا در خارج از Valgrind 117 00:06:00,000 --> 00:06:03,000 و هیچ نشانه ای خطا نیست. 118 00:06:03,000 --> 00:06:06,000 >> با این حال، اجازه دهید نگاهی به تنوع کمی از این برای دیدن 119 00:06:06,000 --> 00:06:09,000 چه کارهایی می توانید واقعا بد است. 120 00:06:09,000 --> 00:06:14,000 بنابراین، داده، ما در حال سوء استفاده از چیزهایی بیشتر از یک بیت در این کد است. 121 00:06:14,000 --> 00:06:17,000 ما فقط اختصاص فضا بر روی پشته دو رشته 122 00:06:17,000 --> 00:06:19,000 طول cs50 سنگ، 123 00:06:19,000 --> 00:06:22,000 در این زمان، به خاطر سپردن / 0 کاراکتر است. 124 00:06:22,000 --> 00:06:25,000 اما پس از آن ما در یک رشته فوق العاده را به بلوک حافظه پرتاب 125 00:06:25,000 --> 00:06:27,000 که S است با اشاره به. 126 00:06:27,000 --> 00:06:30,000 چه اثر است که در بلوک حافظه است که T برای نقاط مورد؟ 127 00:06:30,000 --> 00:06:34,000 خوب، اگر T به حافظه که فقط در مجاورت S، 128 00:06:34,000 --> 00:06:37,000 فقط پس از آن، 129 00:06:37,000 --> 00:06:39,000 پس از آن ما ممکن است بیش از بخشی از T. نوشته شده است 130 00:06:39,000 --> 00:06:41,000 اجازه اجرای این کد. 131 00:06:41,000 --> 00:06:43,000 نگاهی به آنچه اتفاق افتاده است. 132 00:06:43,000 --> 00:06:47,000 رشته ما در بلوک پشته ما هر دو ذخیره می شود به نظر می رسد که چاپ درستی است. 133 00:06:47,000 --> 00:06:49,000 هیچ چیز اشتباه به نظر می رسد در همه. 134 00:06:49,000 --> 00:06:52,000 با این حال، اجازه دهید به عقب برویم به کد ما و 135 00:06:52,000 --> 00:06:55,000 اظهار نظر از خط که در آن ما کپی cs50 سنگ 136 00:06:55,000 --> 00:06:59,000 به دومین بلوک حافظه، با اشاره به توسط T. 137 00:06:59,000 --> 00:07:02,000 در حال حاضر، هنگامی که ما برای اجرای این کد باید 138 00:07:02,000 --> 00:07:06,000 تنها محتویات اولین بلوک حافظه نسخه قابل چاپ کردن را ببینید. 139 00:07:06,000 --> 00:07:09,000 اوه، حتی اگر ما STR نسخه 140 00:07:09,000 --> 00:07:12,000 هر کاراکتر را به بلوک پشته دوم، با اشاره به توسط T. 141 00:07:12,000 --> 00:07:15,000 دریافت نسخه قابل چاپ کردن. 142 00:07:15,000 --> 00:07:18,000 در واقع، رشته ما به بلوک اول ما پر شده 143 00:07:18,000 --> 00:07:21,000 تصرف بلوک اول و به بلوک دوم، 144 00:07:21,000 --> 00:07:23,000 همه چیز به نظر می رسد طبیعی است. 145 00:07:23,000 --> 00:07:26,000 Valgrind، هر چند، به ما می گوید داستان واقعی است. 146 00:07:26,000 --> 00:07:28,000 وجود دارد بروید. 147 00:07:28,000 --> 00:07:32,000 همه از کسانی که نامعتبر خواند و می نویسد. 148 00:07:32,000 --> 00:07:36,000 >> بیایید نگاهی به یک نمونه از نوع دیگری از خطا. 149 00:07:36,000 --> 00:07:39,000 در اینجا ما چیزی به جای تاسف است. 150 00:07:39,000 --> 00:07:41,000 فضای بین المللی بر روی پشته و ما با شتاب، 151 00:07:41,000 --> 00:07:45,000 P - - برای اشاره به آن فضا و یک اشاره گر از نوع int مقداردهی اولیه. 152 00:07:45,000 --> 00:07:48,000 با این حال، در حالی که اشاره گر ما است مقداردهی اولیه، 153 00:07:48,000 --> 00:07:52,000 داده هایی را که از آن با اشاره به در فقط به هر آشغال است که در آن بخشی از پشته. 154 00:07:52,000 --> 00:07:55,000 بنابراین، هنگامی که داده ها یه بار به اعضای هیات من، 155 00:07:55,000 --> 00:07:57,000 ما از لحاظ فنی من، مقداردهی اولیه 156 00:07:57,000 --> 00:08:00,000 اما ما این کار را با استفاده از داده های ناخواسته. 157 00:08:00,000 --> 00:08:03,000 فراخوان به ادعا، که یک ماکرو اشکال زدایی مفید است 158 00:08:03,000 --> 00:08:06,000 تعریف شده در درستی به نام ادعا کتابخانه، 159 00:08:06,000 --> 00:08:09,000 اراده سقط جنین برنامه اگر شرایط آزمون خود را با شکست مواجه شده است. 160 00:08:09,000 --> 00:08:11,000 این است که، اگر من 0 است. 161 00:08:11,000 --> 00:08:14,000 با توجه به آنچه در فضای پشته بود، با اشاره به توسط P 162 00:08:14,000 --> 00:08:18,000 این برنامه گاهی اوقات ممکن است کار کند و در زمان های دیگر شکست. 163 00:08:18,000 --> 00:08:20,000 اگر کار می کند، ما فقط خوش شانس. 164 00:08:20,000 --> 00:08:24,000 کامپایلر این خطا نمی رسد، اما مطمئن شوید Valgrind. 165 00:08:24,000 --> 00:08:28,000 خطا ناشی از استفاده ما از اطلاعات آشغال که ما می بینیم. 166 00:08:28,000 --> 00:08:32,000 >> هنگامی که شما تخصیص حافظه پشته اما آن را deallocate یا رایگان از آن، 167 00:08:32,000 --> 00:08:34,000 است که به نام نشت. 168 00:08:34,000 --> 00:08:37,000 کوچک، کوتاه مدت برنامه ای است که اجرا می شود و بلافاصله پس از خروج، 169 00:08:37,000 --> 00:08:39,000 نشت نسبتا بی ضرر هستند، 170 00:08:39,000 --> 00:08:42,000 اما برای یک پروژه از اندازه بزرگتر و / یا طول عمر، 171 00:08:42,000 --> 00:08:46,000 حتی یک سوراخ کوچک می تواند به چیزی بزرگ ترکیب. 172 00:08:46,000 --> 00:08:49,000 برای CS50، ما از شما انتظار 173 00:08:49,000 --> 00:08:51,000 مراقبت از آزاد همه از حافظه پشته که به شما اختصاص، 174 00:08:51,000 --> 00:08:54,000 از آنجایی که ما می خواهیم شما را به ایجاد مهارت های لازم برای روند کتابچه راهنمای کاربر به درستی رسیدگی 175 00:08:54,000 --> 00:08:56,000 مورد نیاز توسط C. 176 00:08:56,000 --> 00:08:59,000 برای انجام این کار، برنامه خود را باید دقیق 177 00:08:59,000 --> 00:09:03,000 یک به یک مکاتبات بین malloc و تماس رایگان. 178 00:09:03,000 --> 00:09:06,000 خوشبختانه، Valgrind می تواند شما را با نشت حافظه کمک کند بیش از حد. 179 00:09:06,000 --> 00:09:09,000 در اینجا است که یک برنامه چکه کن به نام leak.c که اختصاص 180 00:09:09,000 --> 00:09:13,000 فضا را بر روی پشته، می نویسد: به آن است، اما این برنامه رایگان نیست. 181 00:09:13,000 --> 00:09:16,000 آن را کامپایل ما با ایجاد و اجرای آن را تحت Valgrind، 182 00:09:16,000 --> 00:09:18,000 و ما می بینیم که، در حالی که ما هیچ خطاهای حافظه، 183 00:09:18,000 --> 00:09:20,000 ما یک نشت. 184 00:09:20,000 --> 00:09:23,000 16 بایت قطعا از دست رفته وجود دارد، 185 00:09:23,000 --> 00:09:27,000 به این معنی که اشاره گر به آن حافظه در محدوده زمانی بود که این برنامه خارج است. 186 00:09:27,000 --> 00:09:30,000 در حال حاضر، Valgrind به ما یک تن اطلاعات در مورد نشت، 187 00:09:30,000 --> 00:09:35,000 اما اگر این یادداشت کوچک را دنبال می کنیم آن را می دهد که به سمت پایین از گزارش خود 188 00:09:35,000 --> 00:09:38,000 به نمایش مجدد فیلم - نشت بررسی کامل 189 00:09:38,000 --> 00:09:41,000 برای دیدن جزئیات کامل از حافظه به بیرون درز، 190 00:09:41,000 --> 00:09:44,000 خواهیم اطلاعات بیشتری دریافت کنید. 191 00:09:44,000 --> 00:09:46,000 در حال حاضر، در خلاصه پشته، 192 00:09:46,000 --> 00:09:50,000 Valgrind به ما می گوید که در آن حافظه است که از دست داده بود در ابتدا اختصاص داده شد. 193 00:09:50,000 --> 00:09:52,000 همانطور که می دانید از به دنبال در کد منبع، 194 00:09:52,000 --> 00:09:55,000 Valgrind به ما اطلاع داده است که ما به بیرون درز حافظه 195 00:09:55,000 --> 00:09:58,000 اختصاص داده شده با یک تماس به malloc در خط 8 از leak.c 196 00:09:58,000 --> 00:10:00,000 در تابع اصلی. 197 00:10:00,000 --> 00:10:02,000 زیبا بسیار خوب است. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind طبقه بندی نشت با استفاده از این شرایط: 199 00:10:04,000 --> 00:10:07,000 قطعا از دست داده است - این است که پشته اختصاص داده حافظه 200 00:10:07,000 --> 00:10:10,000 که به این برنامه دیگر دارای یک اشاره گر است. 201 00:10:10,000 --> 00:10:14,000 Valgrind می داند که شما یک بار تا به حال اشاره گر، ولی پس از پیگیری از آن را از دست داده است. 202 00:10:14,000 --> 00:10:17,000 این حافظه است که قطعا به بیرون درز است. 203 00:10:17,000 --> 00:10:20,000 به طور غیر مستقیم از دست داده است - این است که پشته اختصاص داده حافظه 204 00:10:20,000 --> 00:10:24,000 که اشاره گر به آن نیز از دست داده است. 205 00:10:24,000 --> 00:10:27,000 به عنوان مثال، اگر شما از دست داده اشاره گر خود را به اولین گره لیست پیوندی، 206 00:10:27,000 --> 00:10:30,000 سپس خود گره اول خواهد بود قطعا از دست داده است، 207 00:10:30,000 --> 00:10:34,000 در حالی که هر گره پس از آن می توان به طور غیر مستقیم از دست داده است. 208 00:10:34,000 --> 00:10:37,000 احتمالا از دست داده است - این است که پشته اختصاص داده حافظه 209 00:10:37,000 --> 00:10:41,000 که به Valgrind نمی تواند مطمئن باشد که آیا یک اشاره گر وجود دارد یا نه. 210 00:10:41,000 --> 00:10:44,000 هنوز هم در دسترس heap از حافظه اختصاص داده شده است 211 00:10:44,000 --> 00:10:47,000 که این برنامه هنوز هم دارای یک اشاره گر در خروج، 212 00:10:47,000 --> 00:10:50,000 که به طور معمول این بدان معنی است که جهانی متغیر به آن است. 213 00:10:50,000 --> 00:10:53,000 برای بررسی این نشت، شما همچنین باید این گزینه را به 214 00:10:53,000 --> 00:10:55,000 - هنوز قابل دسترسی = بله 215 00:10:55,000 --> 00:10:58,000 در نیایش خود را از Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> این موارد مختلف ممکن است استراتژی های مختلفی را برای تمیز کردن آنها نیاز به، 217 00:11:01,000 --> 00:11:05,000 اما نشت باید حذف شود. 218 00:11:05,000 --> 00:11:08,000 متاسفانه، رفع نشت می تواند سخت به انجام. 219 00:11:08,000 --> 00:11:11,000 از آنجا که تماس های نادرست به رایگان می توانید منفجر کردن برنامه شما. 220 00:11:11,000 --> 00:11:14,000 برای مثال، اگر ما در invalid_free.c نگاه، 221 00:11:14,000 --> 00:11:18,000 ما می بینیم به عنوان مثال از deallocation حافظه بد. 222 00:11:18,000 --> 00:11:21,000 آنچه که باید تماس تنها به آزاد کل بلوک 223 00:11:21,000 --> 00:11:24,000 از حافظه اشاره کرد به توسط int_block، 224 00:11:24,000 --> 00:11:27,000 به جای تبدیل شدن به یک تلاش برای آزاد اندازه هر بخش INT- 225 00:11:27,000 --> 00:11:29,000 از حافظه جداگانه است. 226 00:11:29,000 --> 00:11:32,000 این catastrophically با شکست مواجه خواهد شد. 227 00:11:32,000 --> 00:11:34,000 بوم! چه خطا است. 228 00:11:34,000 --> 00:11:36,000 این است که قطعا خوب نیست. 229 00:11:36,000 --> 00:11:39,000 اگر شما با این نوع از خطا گیر کرده است، هر چند، و شما نمی دانید که به کجا نگاه کنند. 230 00:11:39,000 --> 00:11:41,000 سقوط در بهترین دوست شما. 231 00:11:41,000 --> 00:11:44,000 شما آن را حدس زده - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind، مثل همیشه، می داند که دقیقا همان چیزی است که تا. 233 00:11:47,000 --> 00:11:50,000 تعداد alloc و آزاد با هم مطابقت ندارند. 234 00:11:50,000 --> 00:11:52,000 ما باید 1 alloc و 4 آزاد است. 235 00:11:52,000 --> 00:11:55,000 و Valgrind همچنین به ما می گوید که در آن برای اولین بار بد رایگان - 236 00:11:55,000 --> 00:11:58,000 یکی از که باعث blowup - در حال آمدن است - 237 00:11:58,000 --> 00:12:00,000 خط 16. 238 00:12:00,000 --> 00:12:03,000 همانطور که می بینید، تماس های بد را به آزاد واقعا بد است، 239 00:12:03,000 --> 00:12:05,000 بنابراین توصیه می کنیم اجازه نشت برنامه خود را 240 00:12:05,000 --> 00:12:08,000 در حالی که شما در حال کار بر روی قابلیت صحیح است. 241 00:12:08,000 --> 00:12:12,000 شروع به دنبال نشت تنها پس از برنامه های خود را در حال کار مناسب، 242 00:12:12,000 --> 00:12:14,000 بدون هیچ گونه اشتباهات دیگر. 243 00:12:14,000 --> 00:12:16,000 >> و این همه ایم برای این فیلم کردم. 244 00:12:16,000 --> 00:12:18,000 در حال حاضر آنچه از شما انتظار دارند؟ 245 00:12:18,000 --> 00:12:21,000 برو اجرا Valgrind در برنامه های خود را در حال حاضر. 246 00:12:21,000 --> 00:12:25,000 نام من مقابله Hardison است. این CS50 است. [CS50.TV]