1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Shprehje] 2 00:00:02,000 --> 00:00:05,000 [Nate Hardison, Universiteti i Harvardit] 3 00:00:05,000 --> 00:00:07,000 Kjo është CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Disa nga mete më të vështira në programet C 5 00:00:10,000 --> 00:00:13,000 vijnë nga keqadministrimi i kujtesës. 6 00:00:13,000 --> 00:00:15,000 Ka një numër të madh të mënyrave për të vidhos gjërat, 7 00:00:15,000 --> 00:00:17,000 përfshirë alokimin sasinë e gabuar e kujtesës, 8 00:00:17,000 --> 00:00:20,000 harruar të nisja variablave, 9 00:00:20,000 --> 00:00:23,000 shkruar para ose pas përfundimit të një tampon, 10 00:00:23,000 --> 00:00:25,000 dhe liruar mbajtur herë kujtesës shumta. 11 00:00:25,000 --> 00:00:28,000 Simptomat variojnë nga crashes përhershme 12 00:00:28,000 --> 00:00:30,000 të vlerave misterioze overwritten, 13 00:00:30,000 --> 00:00:34,000 shpesh në vende dhe kohë larg nga gabimi origjinal. 14 00:00:34,000 --> 00:00:37,000 Tracing problemin vërejtur përsëri shkaku themelor rrënjë 15 00:00:37,000 --> 00:00:39,000 mund të jenë të vështira, 16 00:00:39,000 --> 00:00:42,000 por fatmirësisht ka një program të dobishme të quajtur Shprehje 17 00:00:42,000 --> 00:00:44,000 që mund të bëjë shumë për të ndihmuar. 18 00:00:44,000 --> 00:00:47,000 >> Ju drejtuar një program nën Shprehje për të mundësuar 19 00:00:47,000 --> 00:00:50,000 Kontrollimi i gjerë i alokimeve kujtesës tog dhe akseseve. 20 00:00:50,000 --> 00:00:53,000 Kur Shprehje zbulon një problem, kjo ju jep menjëhershme, 21 00:00:53,000 --> 00:00:56,000 Informacioni i drejtpërdrejtë që ju lejon të 22 00:00:56,000 --> 00:00:58,000 më të lehtë të gjeni dhe të zgjidhur problemin. 23 00:00:58,000 --> 00:01:01,000 Shprehje edhe raporte mbi çështje të kujtesës më pak vdekjeprurëse, 24 00:01:01,000 --> 00:01:04,000 të tilla si rrjedhjet e kujtesës, e kujtesës tog ndarjes, 25 00:01:04,000 --> 00:01:07,000 dhe duke harruar për të liruar atë. 26 00:01:07,000 --> 00:01:10,000 Ashtu si tingëllimë tonë, përpilues, në Rregullues tonë, GDB, 27 00:01:10,000 --> 00:01:14,000 Shprehje është software i lirë, dhe kjo është instaluar në aplikim. 28 00:01:14,000 --> 00:01:16,000 Shprehje shkon në ekzekutues tuaj binar, 29 00:01:16,000 --> 00:01:20,000 jo. tuaj ose c. kodin burim h fotografi, 30 00:01:20,000 --> 00:01:23,000 në mënyrë të sigurt që ju keni hartuar një kopje të up-to-date të programit tuaj 31 00:01:23,000 --> 00:01:25,000 përdorur ose tingëllimë të bërë. 32 00:01:25,000 --> 00:01:28,000 Pastaj, drejtimin e programit tuaj nën Shprehje mund të jetë 33 00:01:28,000 --> 00:01:32,000 aq e thjeshtë sa vetëm prefixing komandën standarde programin Shprehje me fjalë, 34 00:01:32,000 --> 00:01:35,000 e cila fillon Shprehje dhe drejton programin në brendësi të saj. 35 00:01:35,000 --> 00:01:38,000 Kur fillon, Shprehje bën disa komplekse 36 00:01:38,000 --> 00:01:41,000 jiggering për konfigurimin e ekzekutueshme për kontrollet e kujtesës, 37 00:01:41,000 --> 00:01:44,000 kështu që ajo mund të marrë një grimë për të marrë dhe drejtimin. 38 00:01:44,000 --> 00:01:48,000 Programi do të ekzekutojë normalisht, të jetë ajo shumë më ngadalë, 39 00:01:48,000 --> 00:01:52,000 dhe kur ajo mbaron, Shprehje do të shtypura një përmbledhje të përdorimit të saj kujtesës. 40 00:01:52,000 --> 00:01:58,000 Nëse gjithçka shkon mirë, kjo do të duket diçka si kjo: 41 00:01:58,000 --> 00:02:01,000 Në këtë rast,. / Clean_program 42 00:02:01,000 --> 00:02:04,000 është rruga për programin dua për të kandiduar. 43 00:02:04,000 --> 00:02:06,000 Dhe, ndërsa kjo nuk ka marrë ndonjë argumente, 44 00:02:06,000 --> 00:02:09,000 në qoftë se ai e bëri Dua vetëm ato në litar në fund të komandës si zakonisht. 45 00:02:09,000 --> 00:02:12,000 Programi pastër është vetëm një program silly pak kam krijuar 46 00:02:12,000 --> 00:02:15,000 që ndan hapësirë ​​për një bllok të ints në tog, 47 00:02:15,000 --> 00:02:19,000 vënë disa vlera në brendësi të tyre, dhe liron bllok të tërë. 48 00:02:19,000 --> 00:02:23,000 Kjo është ajo që ju jeni të shtënat për të, pa gabime dhe pa rrjedhjet. 49 00:02:23,000 --> 00:02:27,000 >> Një tjetër metrikë e rëndësishme është numri i përgjithshëm i bytes alokuara. 50 00:02:27,000 --> 00:02:32,000 Në varësi të programit, nëse tuaja janë alokimet në MB ose më të larta, 51 00:02:32,000 --> 00:02:34,000 ndoshta ju jeni duke bërë diçka të gabuar. 52 00:02:34,000 --> 00:02:37,000 A jeni të panevojshme ruajtjen kopje identike? 53 00:02:37,000 --> 00:02:40,000 A jeni duke përdorur tog për ruajtjen, kur ajo do të jetë më mirë për të përdorur rafte? 54 00:02:40,000 --> 00:02:43,000 Pra, gabimet e kujtesës mund të jetë me të vërtetë e keqe. 55 00:02:43,000 --> 00:02:46,000 Ato më të dukshme të shkaktojë crashes spektakolare, 56 00:02:46,000 --> 00:02:49,000 por edhe atëherë ajo ende mund të jetë e vështirë për të identifikuar 57 00:02:49,000 --> 00:02:51,000 çfarë saktësisht çoi në rrëzimin. 58 00:02:51,000 --> 00:02:54,000 Më shumë insidiously, një program me një gabim e kujtesës 59 00:02:54,000 --> 00:02:56,000 ende mund të përpilojnë pastër 60 00:02:56,000 --> 00:02:58,000 dhe ende mund të duket për të punuar si duhet 61 00:02:58,000 --> 00:03:01,000 sepse keni arritur të merrni me fat më të madhe të kohës. 62 00:03:01,000 --> 00:03:04,000 Pas disa rezultateve të suksesshme "," 63 00:03:04,000 --> 00:03:07,000 ju vetëm mund të mendojnë se një përplasje është një pikë për shans i kompjuterit, 64 00:03:07,000 --> 00:03:10,000 por kompjuteri nuk është e gabuar. 65 00:03:10,000 --> 00:03:13,000 >> Drejtimin Shprehje mund të ju ndihmojë të gjetur shkakun e gabimeve të dukshme të kujtesës 66 00:03:13,000 --> 00:03:18,000 si dhe të gjeni përgjojnë gabimet ju nuk dini ende rreth. 67 00:03:18,000 --> 00:03:22,000 Çdo herë Shprehje zbulon një problem, ajo printon informacion në lidhje me atë vërejtur. 68 00:03:22,000 --> 00:03:24,000 Çdo artikull është mjaft i shkurtër - 69 00:03:24,000 --> 00:03:27,000 vija burimi i udhëzimit ofendim, çfarë është çështja, 70 00:03:27,000 --> 00:03:30,000 dhe një info pak për kujtesën e përfshirë - 71 00:03:30,000 --> 00:03:34,000 por shpesh kjo është informacion të mjaftueshëm për të drejtuar vëmendjen tuaj në vendin e duhur. 72 00:03:34,000 --> 00:03:37,000 Këtu është një shembull i Shprehje kandidon për një program buggy 73 00:03:37,000 --> 00:03:40,000 që bën një lexuar pavlefshme e kujtesës tog. 74 00:03:40,000 --> 00:03:49,000 Ne e shohim asnjë gabim ose paralajmërime në hartimin. 75 00:03:49,000 --> 00:03:53,000 Uh-oh, përmbledhje gabimi thotë se ka dy gabime - 76 00:03:53,000 --> 00:03:56,000 dy herë lexuar pavlefshme të madhësisë 4 - bytes, që është. 77 00:03:56,000 --> 00:04:01,000 Dy keqe lexon ndodhur në funksion kryesor të invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 i pari on line 16 dhe të dytë në linjë 19. 79 00:04:04,000 --> 00:04:06,000 Le të shikojmë në kodin. 80 00:04:06,000 --> 00:04:11,000 Duket si thirrje për të parë printf përpiqet për të lexuar një int kaluara në fund të bllokut tonë të kujtesës. 81 00:04:11,000 --> 00:04:13,000 Nëse ne shikojmë prapa në dalje Shprehje së, 82 00:04:13,000 --> 00:04:16,000 ne shohim se Shprehje na tha pikërisht këtë. 83 00:04:16,000 --> 00:04:19,000 Adresa ne jemi duke u përpjekur për të lexuar fillon 0 bytes 84 00:04:19,000 --> 00:04:22,000 kaluara në fund të bllokut të madhësisë 16 bytes - 85 00:04:22,000 --> 00:04:25,000 katër 32-bit ints që ne alokuara. 86 00:04:25,000 --> 00:04:29,000 Kjo është, adresa ne ishin duke u përpjekur për të lexuar fillon të drejtën në fund të bllokut tonë, 87 00:04:29,000 --> 00:04:32,000 ashtu si ne e shohim në thirrjen tonë printf keqe. 88 00:04:32,000 --> 00:04:36,000 Tani, të pavlefshme lexuar mund të mos duket si kjo e madhe e një marrëveshje, 89 00:04:36,000 --> 00:04:39,000 por në qoftë se ju jeni duke përdorur që të dhënat për të kontrolluar rrjedhën e programit tuaj - 90 00:04:39,000 --> 00:04:42,000 për shembull, si pjesë e një në qoftë se deklarata ose loop - 91 00:04:42,000 --> 00:04:45,000 atëherë gjërat mund të shkojnë keq në heshtje. 92 00:04:45,000 --> 00:04:47,000 Shikojnë se si unë mund të drejtuar programin invalid_read 93 00:04:47,000 --> 00:04:50,000 dhe asgjë nga të zakonshëm ndodh. 94 00:04:50,000 --> 00:04:52,000 Frikshme, Huh? 95 00:04:52,000 --> 00:04:56,000 >> Tani, le të shohim në disa lloje më të gabimeve që ju mund të hasni në kodin tuaj, 96 00:04:56,000 --> 00:04:59,000 dhe ne do të shohim se si Shprehje e zbulon ato. 97 00:04:59,000 --> 00:05:01,000 Ne vetëm e pa një shembull të një invalid_read, 98 00:05:01,000 --> 00:05:04,000 kështu që tani le të shikoni një invalid_write. 99 00:05:04,000 --> 00:05:09,000 Përsëri, nuk ka gabime apo paralajmërimet në hartimin. 100 00:05:09,000 --> 00:05:12,000 Mirë, Shprehje thotë se ka dy gabime në këtë program - 101 00:05:12,000 --> 00:05:15,000 dhe invalid_write dhe një invalid_read. 102 00:05:15,000 --> 00:05:18,000 Le të kontrolluar këtë kod. 103 00:05:18,000 --> 00:05:21,000 Duket sikur ne kemi marrë një shembull të strlen klasik plus një bug. 104 00:05:21,000 --> 00:05:24,000 Kodi nuk malloc një bajt shtesë të hapësirës 105 00:05:24,000 --> 00:05:26,000 për të karakter / 0, 106 00:05:26,000 --> 00:05:30,000 kështu që kur str kopje shkoi për të shkruar atë në ssubstrlen "CS50 shkëmbinjve!" 107 00:05:30,000 --> 00:05:33,000 ajo shkroi 1 bajt kaluara në fund të bllokut tonë. 108 00:05:33,000 --> 00:05:36,000 The invalid_read vjen kur kemi bërë thirrjen tonë për printf. 109 00:05:36,000 --> 00:05:40,000 Printf përfundon leximin e kujtesës pavlefshëm kur ai lexon / 0 karakter 110 00:05:40,000 --> 00:05:43,000 si duket në fund të këtij vargut E kjo është shtypje. 111 00:05:43,000 --> 00:05:45,000 Por kjo nuk shpëtoi Shprehje. 112 00:05:45,000 --> 00:05:48,000 Ne e shohim se ajo kapur invalid_write si pjesë e kopjes rr 113 00:05:48,000 --> 00:05:51,000 në përputhje 11 e kryesor, dhe invalid_read është pjesë e printf. 114 00:05:51,000 --> 00:05:54,000 Rock në, Shprehje. 115 00:05:54,000 --> 00:05:57,000 Përsëri, kjo nuk mund të duket si një marrëveshje e madhe. 116 00:05:57,000 --> 00:06:00,000 Ne mund të drejtuar këtë program pa pushim jashtë Shprehje 117 00:06:00,000 --> 00:06:03,000 dhe nuk shoh asnjë simptome gabim. 118 00:06:03,000 --> 00:06:06,000 >> Megjithatë, le të shohim në një variacion të vogël të kësaj për të parë 119 00:06:06,000 --> 00:06:09,000 se si gjërat mund të merrni të vërtetë e keqe. 120 00:06:09,000 --> 00:06:14,000 Pra, jepet, ne po abuzojnë gjëra më shumë se vetëm një grimë në këtë kod. 121 00:06:14,000 --> 00:06:17,000 Ne jemi vetëm shpërndarjen hapësirë ​​në grumbull për dy vargjet 122 00:06:17,000 --> 00:06:19,000 gjatësia e CS50 shkëmbinjve, 123 00:06:19,000 --> 00:06:22,000 këtë herë, kujtohet / 0 karakter. 124 00:06:22,000 --> 00:06:25,000 Por pastaj ne e hedhin në një varg të super-të gjatë në bllokun e kujtesës 125 00:06:25,000 --> 00:06:27,000 se S është duke treguar për të. 126 00:06:27,000 --> 00:06:30,000 Çfarë efekti do të ketë kjo në bllok kujtesës që pikë në T? 127 00:06:30,000 --> 00:06:34,000 E pra, nëse pikë t për të kujtesës që është vetëm ngjitur me S, 128 00:06:34,000 --> 00:06:37,000 vjen vetëm pas saj, 129 00:06:37,000 --> 00:06:39,000 atëherë ne mund të ketë shkruar mbi pjesë të T. 130 00:06:39,000 --> 00:06:41,000 Le të drejtuar këtë kod. 131 00:06:41,000 --> 00:06:43,000 Shikoni se çfarë ka ndodhur. 132 00:06:43,000 --> 00:06:47,000 Vargjet ne ruajtura në blloqet tona grumbullosh të dyja duket se kanë shtypur saktë. 133 00:06:47,000 --> 00:06:49,000 Asgjë nuk duket e gabuar në të gjitha. 134 00:06:49,000 --> 00:06:52,000 Sidoqoftë, le të kthehemi në kodin tonë dhe 135 00:06:52,000 --> 00:06:55,000 komentuar nga linjën ku ne kopje CS50 shkëmbinj 136 00:06:55,000 --> 00:06:59,000 në bllokun e dytë e kujtesës, vuri në dukje nga t. 137 00:06:59,000 --> 00:07:02,000 Tani, kur ne të drejtuar këtë kod ne duhet 138 00:07:02,000 --> 00:07:06,000 vetëm shikoni përmbajtjen e bllokut të parë të shtypura jashtë kujtesës. 139 00:07:06,000 --> 00:07:09,000 Whoa, edhe pse ne nuk str kopje 140 00:07:09,000 --> 00:07:12,000 ndonjë karaktere në bllokun e dytë grumbull, ai vuri në dukje nga T, 141 00:07:12,000 --> 00:07:15,000 ne kemi marrë një të shtypura jashtë. 142 00:07:15,000 --> 00:07:18,000 Në të vërtetë, ne string mbushur në bllokun tonë të parë 143 00:07:18,000 --> 00:07:21,000 morën bllokun e parë dhe në bllokun e dytë, 144 00:07:21,000 --> 00:07:23,000 bërë gjithçka duket normale. 145 00:07:23,000 --> 00:07:26,000 Shprehje, edhe pse, na tregon historinë e vërtetë. 146 00:07:26,000 --> 00:07:28,000 Nuk shkojmë. 147 00:07:28,000 --> 00:07:32,000 Të gjithë ata pavlefshme lexon dhe shkruan. 148 00:07:32,000 --> 00:07:36,000 >> Le të shikojmë në një shembull të një tjetër lloj të gabimit. 149 00:07:36,000 --> 00:07:39,000 Këtu kemi të bëjmë diçka më tepër fatkeq. 150 00:07:39,000 --> 00:07:41,000 Ne rrëmbyer hapësirë ​​për një int mbi tok, 151 00:07:41,000 --> 00:07:45,000 dhe ne nisja një tregues int - p - për pikë në atë hapësirë. 152 00:07:45,000 --> 00:07:48,000 Megjithatë, ndërsa treguesin jonë është initialized, 153 00:07:48,000 --> 00:07:52,000 të dhënat që ai është treguar të vetëm ka çfarëdo junk është në atë pjesë të tog. 154 00:07:52,000 --> 00:07:55,000 Pra, kur ne load që të dhënat në int i, 155 00:07:55,000 --> 00:07:57,000 ne teknikisht nisja i, 156 00:07:57,000 --> 00:08:00,000 por ne bëjmë kështu me të dhëna junk. 157 00:08:00,000 --> 00:08:03,000 Thirrja tek pohojnë, e cila është një makro dobishëm Debugging 158 00:08:03,000 --> 00:08:06,000 përcaktuar në bibliotekë quajtur me vend pohojnë, 159 00:08:06,000 --> 00:08:09,000 do të ndërpresin shtatzëninë programi nëse gjendja e tij testi dështon. 160 00:08:09,000 --> 00:08:11,000 Kjo është, në qoftë se unë nuk është 0. 161 00:08:11,000 --> 00:08:14,000 Varësisht se çfarë ishte në hapësirë ​​tog me ta, vuri në dukje nga p, 162 00:08:14,000 --> 00:08:18,000 ky program mund të punojnë dhe nganjëherë dështojnë në raste të tjera. 163 00:08:18,000 --> 00:08:20,000 Në qoftë se ajo punon, ne jemi vetëm duke u fat. 164 00:08:20,000 --> 00:08:24,000 Përpiluesit nuk do të arrijë këtë gabim, por Shprehje do të sigurt. 165 00:08:24,000 --> 00:08:28,000 Nuk shohim gabimin që rrjedh nga përdorimi tonë të të dhënave që junk. 166 00:08:28,000 --> 00:08:32,000 >> Kur ju siguroj kujtesë tog por mos mos rezervim apo liruar atë, 167 00:08:32,000 --> 00:08:34,000 që quhet një rrjedhje. 168 00:08:34,000 --> 00:08:37,000 Për një program të vogël, jetëshkurtër që shkon dhe menjëherë daljet, 169 00:08:37,000 --> 00:08:39,000 rrjedhjet janë mjaft të padëmshme, 170 00:08:39,000 --> 00:08:42,000 por për një projekt të përmasave të mëdha dhe / ose jetëgjatësinë, 171 00:08:42,000 --> 00:08:46,000 edhe një rrjedhje të vogël mund të përbëjë në diçka të madhe. 172 00:08:46,000 --> 00:08:49,000 Për CS50, ne nuk presin që ju të 173 00:08:49,000 --> 00:08:51,000 të kujdeset për të liruar të gjithë kujtesën grumbull që ju shpërndarë, 174 00:08:51,000 --> 00:08:54,000 pasi ne duam që ju të ndërtuar aftësitë për të trajtuar si duhet procesin manual 175 00:08:54,000 --> 00:08:56,000 kërkohet nga C. 176 00:08:56,000 --> 00:08:59,000 Për ta bërë këtë, programi juaj duhet të ketë një saktë 177 00:08:59,000 --> 00:09:03,000 një-për-një korrespondencë mes malloc dhe thirrje falas. 178 00:09:03,000 --> 00:09:06,000 Për fat të mirë, Shprehje mund të ju ndihmojë me rrjedhjet e kujtesës shumë. 179 00:09:06,000 --> 00:09:09,000 Këtu është një program i quajtur pikon leak.c që ndan 180 00:09:09,000 --> 00:09:13,000 hapësirë ​​në tog, shkruan në të, por nuk lirojë atë. 181 00:09:13,000 --> 00:09:16,000 Ne hartimin atë me të bërë dhe drejtuar atë nën Shprehje, 182 00:09:16,000 --> 00:09:18,000 dhe ne shohim se, ndërsa ne nuk kemi gabime kujtesës, 183 00:09:18,000 --> 00:09:20,000 ne nuk kemi një rrjedhje. 184 00:09:20,000 --> 00:09:23,000 Nuk janë 16 bytes humbur përfundimisht, 185 00:09:23,000 --> 00:09:27,000 thotë se tregues për atë memorie nuk ishte në fushën kur programi exited. 186 00:09:27,000 --> 00:09:30,000 Tani, Shprehje nuk na jep një ton të informacionit në lidhje me rrjedhje, 187 00:09:30,000 --> 00:09:35,000 por në qoftë se ne ndjekim këtë shënim të vogël se ajo i jep poshtë drejt fund të raportit të tij 188 00:09:35,000 --> 00:09:38,000 për ribërjen me - rrjedhje-check = plotë 189 00:09:38,000 --> 00:09:41,000 për të parë detajet e plota të kujtesës rrjedhur, 190 00:09:41,000 --> 00:09:44,000 ne do të merrni më shumë informacion. 191 00:09:44,000 --> 00:09:46,000 Tani, në përmbledhje tog, 192 00:09:46,000 --> 00:09:50,000 Shprehje e na tregon ku kujtesës që është humbur është ndarë fillimisht. 193 00:09:50,000 --> 00:09:52,000 Ashtu siç e dimë nga kërkoj në kodin burim, 194 00:09:52,000 --> 00:09:55,000 Shprehje na informon se ne rrjedhur kujtesës 195 00:09:55,000 --> 00:09:58,000 ndarë me një thirrje për malloc on line 8 të leak.c 196 00:09:58,000 --> 00:10:00,000 në funksion kryesor. 197 00:10:00,000 --> 00:10:02,000 Pretty mrekullueshëm. 198 00:10:02,000 --> 00:10:04,000 >> Shprehje e kategorizon rrjedhjet përdorur këto terma: 199 00:10:04,000 --> 00:10:07,000 Humbur definitivisht - kjo është kujtesa tog alokuar 200 00:10:07,000 --> 00:10:10,000 në të cilat programi nuk ka një tregues. 201 00:10:10,000 --> 00:10:14,000 Shprehje e di që ju dikur e kishte treguesin, por që kanë humbur gjurmët e saj. 202 00:10:14,000 --> 00:10:17,000 Kjo memorie është zbuluar përfundimisht. 203 00:10:17,000 --> 00:10:20,000 Humbur në mënyrë të tërthortë - kjo është kujtesa tog alokuar 204 00:10:20,000 --> 00:10:24,000 në të cilën pointers vetëm për atë edhe janë të humbur. 205 00:10:24,000 --> 00:10:27,000 Për shembull, nëse keni humbur treguesin tuaj të nyjen e parë të një liste të lidhura, 206 00:10:27,000 --> 00:10:30,000 pastaj nyjen e parë vetë do të humbasin përfundimisht, 207 00:10:30,000 --> 00:10:34,000 ndërsa çdo nyje pasuese do të jetë e humbur në mënyrë të tërthortë. 208 00:10:34,000 --> 00:10:37,000 Humbur ndoshta - kjo është kujtesa tog alokuar 209 00:10:37,000 --> 00:10:41,000 tek e cila Shprehje nuk mund të jetë i sigurte nëse ka një akrep ose jo. 210 00:10:41,000 --> 00:10:44,000 Ende e arritshme është e kujtesës tog alokuar 211 00:10:44,000 --> 00:10:47,000 në të cilën programi ende ka një tregues në dalje, 212 00:10:47,000 --> 00:10:50,000 që zakonisht do të thotë se një pikë globale ndryshueshme të saj. 213 00:10:50,000 --> 00:10:53,000 Për të kontrolluar për këto rrjedhjet, ju do të duhet të përfshijë opsionin 214 00:10:53,000 --> 00:10:55,000 - Ende të arritshme = yes 215 00:10:55,000 --> 00:10:58,000 në thirrje tuaj të Shprehje. 216 00:10:58,000 --> 00:11:01,000 >> Këto raste të ndryshme mund të kërkojnë strategji të ndryshme për pastrimin e tyre lart, 217 00:11:01,000 --> 00:11:05,000 por rrjedhjet duhet të eliminohen. 218 00:11:05,000 --> 00:11:08,000 Fatkeqësisht, fiksimin rrjedhjet mund të jetë e vështirë për të bërë, 219 00:11:08,000 --> 00:11:11,000 pasi thirrjet pasakta të lirë mund të hedhur në erë programin tuaj. 220 00:11:11,000 --> 00:11:14,000 Për shembull, nëse ne shikojmë në invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 ne shohim një shembull të keq deallocation kujtesës. 222 00:11:18,000 --> 00:11:21,000 Çfarë duhet të jetë një thirrje e vetme për të liruar e bllokut të gjithë 223 00:11:21,000 --> 00:11:24,000 e kujtesës vuri në dukje nga int_block, 224 00:11:24,000 --> 00:11:27,000 në vend është bërë një përpjekje për të liruar çdo seksion int-sized 225 00:11:27,000 --> 00:11:29,000 i memories individualisht. 226 00:11:29,000 --> 00:11:32,000 Kjo do të dështojnë katastrofike. 227 00:11:32,000 --> 00:11:34,000 Boom! Çfarë një gabim. 228 00:11:34,000 --> 00:11:36,000 Kjo nuk është aspak e mirë. 229 00:11:36,000 --> 00:11:39,000 Nëse jeni të mbërthyer me këtë lloj të gabimit, edhe pse, dhe ju nuk e dini ku të kërkoni, 230 00:11:39,000 --> 00:11:41,000 bien përsëri në mik të ri tuaj më të mirë. 231 00:11:41,000 --> 00:11:44,000 Ju mendoi ai - Shprehje. 232 00:11:44,000 --> 00:11:47,000 Shprehje, si gjithmonë, e di saktësisht se çfarë është lart. 233 00:11:47,000 --> 00:11:50,000 Numëron shenjat e lirë dhe nuk përputhen deri. 234 00:11:50,000 --> 00:11:52,000 Ne kemi marrë shenjat e 1 dhe 4 çliron. 235 00:11:52,000 --> 00:11:55,000 Dhe Shprehje gjithashtu na tregon se ku thirrja e parë e keqe lirë - 236 00:11:55,000 --> 00:11:58,000 ai që shkaktoi grindje - po vjen nga - 237 00:11:58,000 --> 00:12:00,000 Shkarko 16. 238 00:12:00,000 --> 00:12:03,000 Siç e shihni, e quan të këqija të lirë janë me të vërtetë e keqe, 239 00:12:03,000 --> 00:12:05,000 kështu që ne rekomandojmë lënë rrjedhje tuaj program 240 00:12:05,000 --> 00:12:08,000 ndërsa ju jeni duke punuar në marrjen funksionalitetin e saktë. 241 00:12:08,000 --> 00:12:12,000 Të fillojmë të shikojmë për rrjedhjet vetëm pasi programi juaj është duke punuar si duhet, 242 00:12:12,000 --> 00:12:14,000 pa gabime të tjera. 243 00:12:14,000 --> 00:12:16,000 >> Dhe kjo është e gjitha ne kemi marrë për këtë video. 244 00:12:16,000 --> 00:12:18,000 Tani çfarë jeni duke pritur për të? 245 00:12:18,000 --> 00:12:21,000 Go drejtuar Shprehje në programet tuaja të drejtë tani. 246 00:12:21,000 --> 00:12:25,000 Emri im është Nate Hardison. Kjo është CS50. [CS50.TV]