1 00:00:00,000 --> 00:00:02,000 [Powered by Google Translate] [Valgrind] 2 00:00:02,000 --> 00:00:05,000 [Nate Hardison, Harvard University] 3 00:00:05,000 --> 00:00:07,000 To je CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Nekateri izmed najtežjih napak v programih C 5 00:00:10,000 --> 00:00:13,000 izvira iz slabega upravljanja pomnilnika. 6 00:00:13,000 --> 00:00:15,000 Obstaja veliko več načinov, da vijak stvari, 7 00:00:15,000 --> 00:00:17,000 vključno z dodelitvijo napačno količino pomnilnika, 8 00:00:17,000 --> 00:00:20,000 pozablja za inicializacijo spremenljivk, 9 00:00:20,000 --> 00:00:23,000 pisno pred ali po koncu varovalni pas, 10 00:00:23,000 --> 00:00:25,000 in sprostitev ohraniti spomin večkrat. 11 00:00:25,000 --> 00:00:28,000 Simptomi segajo od nestalnih nesreč 12 00:00:28,000 --> 00:00:30,000 na skrivnostno prepišejo vrednosti, 13 00:00:30,000 --> 00:00:34,000 pogosto na krajih in časih daleč od prvotne napake. 14 00:00:34,000 --> 00:00:37,000 Sledenje ugotovljenega problema nazaj na osnovni vzrok koren 15 00:00:37,000 --> 00:00:39,000 lahko izziv, 16 00:00:39,000 --> 00:00:42,000 K sreči pa obstaja program, imenovan v pomoč Valgrind 17 00:00:42,000 --> 00:00:44,000 da lahko naredimo veliko pomagati. 18 00:00:44,000 --> 00:00:47,000 >> Zaženete program, v okviru Valgrind, ki omogočajo 19 00:00:47,000 --> 00:00:50,000 obsežno preverjanje dodelitve kopice pomnilnika in dostopov. 20 00:00:50,000 --> 00:00:53,000 Ko Valgrind zazna težavo, da vam daje takojšnje, 21 00:00:53,000 --> 00:00:56,000 neposredne informacije, ki vam omogoča, da 22 00:00:56,000 --> 00:00:58,000 lažje najti in popraviti težavo. 23 00:00:58,000 --> 00:01:01,000 Valgrind tudi poročila o smrtnih manj vprašanj pomnilniških 24 00:01:01,000 --> 00:01:04,000 kot spomin pušča, dodelitev kup pomnilnika, 25 00:01:04,000 --> 00:01:07,000 in pozablja, da ga osvobodi. 26 00:01:07,000 --> 00:01:10,000 Všeč mi je naš prevajalnik, Jek, v naš iskalnik napak, GDB, 27 00:01:10,000 --> 00:01:14,000 Valgrind je brezplačna programska oprema, in je nameščen na napravi. 28 00:01:14,000 --> 00:01:16,000 Valgrind deluje na vašem binarnem izvršljiv, 29 00:01:16,000 --> 00:01:20,000 ne vaš. ali c. h datoteke izvorne kode, 30 00:01:20,000 --> 00:01:23,000 tako se prepričajte, da ste pripravljeni za up-to-date kopijo programa 31 00:01:23,000 --> 00:01:25,000 z Jek ali narediti. 32 00:01:25,000 --> 00:01:28,000 Potem se lahko izvaja svoj program v okviru Valgrind biti 33 00:01:28,000 --> 00:01:32,000 tako enostavno, kot le prefixing standardni program ukaz z besedo Valgrind, 34 00:01:32,000 --> 00:01:35,000 , ki se zažene Valgrind in zažene program notri. 35 00:01:35,000 --> 00:01:38,000 Ob zagonu, Valgrind ne nekaj kompleks 36 00:01:38,000 --> 00:01:41,000 jiggering nastaviti izvedljivo za pomnilniške preglede, 37 00:01:41,000 --> 00:01:44,000 tako da lahko traja nekaj vstati in teče. 38 00:01:44,000 --> 00:01:48,000 Program bo nato izvršiti normalno, je to veliko bolj počasi, 39 00:01:48,000 --> 00:01:52,000 in ko se konča, bo Valgrind natisniti povzetek svojega pomnilnika. 40 00:01:52,000 --> 00:01:58,000 Če bo šlo vse dobro, bo videti nekako takole: 41 00:01:58,000 --> 00:02:01,000 V tem primeru. / Clean_program 42 00:02:01,000 --> 00:02:04,000 je pot do programa, ki ga želim teči. 43 00:02:04,000 --> 00:02:06,000 In medtem ko ta ne sprejme nobenih argumentov, 44 00:02:06,000 --> 00:02:09,000 če je to storil sem jih samo prečenje na koncu ukaza, kot ponavadi. 45 00:02:09,000 --> 00:02:12,000 Čisto program je samo neumno malo program sem ustvaril 46 00:02:12,000 --> 00:02:15,000 ki namenja prostor za blok ints na kup, 47 00:02:15,000 --> 00:02:19,000 dal nekaj vrednosti znotraj njih, se sprosti celoten blok. 48 00:02:19,000 --> 00:02:23,000 To je tisto, kar ste streljanje, brez napak in ne pušča. 49 00:02:23,000 --> 00:02:27,000 >> Druga pomembna meritev je skupno število dodeljenih bajtov. 50 00:02:27,000 --> 00:02:32,000 Odvisno od programa, če je vaša sredstva so v MB ali višje, 51 00:02:32,000 --> 00:02:34,000 ste verjetno delaš nekaj narobe. 52 00:02:34,000 --> 00:02:37,000 Ali ste po nepotrebnem shranjevanje kopijo? 53 00:02:37,000 --> 00:02:40,000 Ali uporabljate kup za shranjevanje, če bi bilo bolje uporabiti sveženj? 54 00:02:40,000 --> 00:02:43,000 Torej, lahko pomnilnik napak je res zlo. 55 00:02:43,000 --> 00:02:46,000 Bolj očitni tisti povzročijo spektakularne nesreče, 56 00:02:46,000 --> 00:02:49,000 pa še takrat se lahko še vedno težko izslediti 57 00:02:49,000 --> 00:02:51,000 kaj točno je privedlo do nesreče. 58 00:02:51,000 --> 00:02:54,000 Več zahrbtno, program s pomnilniške napake 59 00:02:54,000 --> 00:02:56,000 Še vedno prevesti 60 00:02:56,000 --> 00:02:58,000 in lahko še vedno zdi, da deluje pravilno 61 00:02:58,000 --> 00:03:01,000 ker ti je uspelo priti srečo večino časa. 62 00:03:01,000 --> 00:03:04,000 Po nekaj uspešnih rezultatov "," 63 00:03:04,000 --> 00:03:07,000 Morda vam bodo samo mislim, da je nesreča krompir iz računalnika, 64 00:03:07,000 --> 00:03:10,000 vendar računalnik ni nikoli narobe. 65 00:03:10,000 --> 00:03:13,000 >> Tek Valgrind vam lahko pomaga izslediti vzrok vidnih napak pomnilnika 66 00:03:13,000 --> 00:03:18,000 kot je bil skrit napake sploh ne vemo o tem. 67 00:03:18,000 --> 00:03:22,000 Vsakič Valgrind zazna težavo, jo natisne informacije o tem, kaj opazili. 68 00:03:22,000 --> 00:03:24,000 Vsaka točka je dokaj jedrnato - 69 00:03:24,000 --> 00:03:27,000 vir linija, ki krši navodila, kaj je vprašanje, 70 00:03:27,000 --> 00:03:30,000 in malo informacij o zadevnem spomin - 71 00:03:30,000 --> 00:03:34,000 pogosto pa je dovolj informacij, da ste pozorni na pravo mesto. 72 00:03:34,000 --> 00:03:37,000 Tukaj je primer Valgrind teče na buggy programa 73 00:03:37,000 --> 00:03:40,000 da ne neveljavno branje pomnilnika kopice. 74 00:03:40,000 --> 00:03:49,000 Bomo videli nobenih napak ali opozoril na kompilacijo. 75 00:03:49,000 --> 00:03:53,000 Uh, napaka povzetek pravi, da obstajata dve napake - 76 00:03:53,000 --> 00:03:56,000 2 neveljavna bralcev velikosti 4 - bytes, da je. 77 00:03:56,000 --> 00:04:01,000 Tako slabo bere prišlo v glavno funkcijo invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 Prvi na liniji 16 in 2. na spletu 19. 79 00:04:04,000 --> 00:04:06,000 Oglejmo si kodo. 80 00:04:06,000 --> 00:04:11,000 Izgleda, da je prvi razpis za printf poskuša prebrati 1 int mimo konca našega spomina bloka. 81 00:04:11,000 --> 00:04:13,000 Če se ozremo na izhodu Valgrind je, 82 00:04:13,000 --> 00:04:16,000 vidimo, da Valgrind nam je povedal točno to. 83 00:04:16,000 --> 00:04:19,000 Naslov poskušamo prebrati začne 0 zlogov 84 00:04:19,000 --> 00:04:22,000 po preteku bloka velikosti 16 bajtov - 85 00:04:22,000 --> 00:04:25,000 4 32-bitne ints, da dodeljena. 86 00:04:25,000 --> 00:04:29,000 To pomeni, da je naslov smo poskušali prebrati začne že ob koncu našega bloka, 87 00:04:29,000 --> 00:04:32,000 tako kot smo videli v naši slabi printf klic. 88 00:04:32,000 --> 00:04:36,000 Sedaj veljavna bralcev morda ne zdi, da je velik posel, 89 00:04:36,000 --> 00:04:39,000 če pa boste uporabljali, da so podatki za nadzor pretoka programu - 90 00:04:39,000 --> 00:04:42,000 na primer kot del if stavek ali zanka - 91 00:04:42,000 --> 00:04:45,000 potem se lahko stvari tiho iti slabo. 92 00:04:45,000 --> 00:04:47,000 Oglejte si, kako lahko zaženete program, invalid_read 93 00:04:47,000 --> 00:04:50,000 in nič nenavadnega zgodi. 94 00:04:50,000 --> 00:04:52,000 Grozljivo, kajne? 95 00:04:52,000 --> 00:04:56,000 >> Zdaj pa si oglejmo nekaj več vrst napak, do katerih lahko pride v kodi, 96 00:04:56,000 --> 00:04:59,000 in bomo videli, kako Valgrind jih zazna. 97 00:04:59,000 --> 00:05:01,000 Pravkar smo videli primer za invalid_read, 98 00:05:01,000 --> 00:05:04,000 Tako zdaj pa odjaviti invalid_write. 99 00:05:04,000 --> 00:05:09,000 Še enkrat, brez napake ali opozorila v zbirki. 100 00:05:09,000 --> 00:05:12,000 Ok, Valgrind pravi, da obstajata dve napake v tem programu - 101 00:05:12,000 --> 00:05:15,000 in invalid_write in invalid_read. 102 00:05:15,000 --> 00:05:18,000 Pa poglejmo to kodo. 103 00:05:18,000 --> 00:05:21,000 Izgleda, da imamo primerek klasične strlen plus eno napako. 104 00:05:21,000 --> 00:05:24,000 Kodeks ne malloc dodatno bajt prostora 105 00:05:24,000 --> 00:05:26,000 za / 0 značaja, 106 00:05:26,000 --> 00:05:30,000 tako da, ko str izvod šel na napisati na ssubstrlen "cs50 skale!" 107 00:05:30,000 --> 00:05:33,000 je napisal 1 bajt po preteku našem bloku. 108 00:05:33,000 --> 00:05:36,000 The invalid_read pride, ko naredimo naš poziv k printf. 109 00:05:36,000 --> 00:05:40,000 Printf konča branje neveljavnih spomin, ko bere / 0 značaja 110 00:05:40,000 --> 00:05:43,000 , kot je videti na koncu te E nizu je tiskanje. 111 00:05:43,000 --> 00:05:45,000 Toda nič od tega pobegnil Valgrind. 112 00:05:45,000 --> 00:05:48,000 Vidimo, da je ujel invalid_write v okviru STR kopije 113 00:05:48,000 --> 00:05:51,000 on line 11 Glavni in invalid_read del printf. 114 00:05:51,000 --> 00:05:54,000 Rock on, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Še enkrat, to morda ne zdi nič takega. 116 00:05:57,000 --> 00:06:00,000 Mi lahko zaženete ta program znova in znova zunaj Valgrind 117 00:06:00,000 --> 00:06:03,000 in ne vidim nobenih napak simptomov. 118 00:06:03,000 --> 00:06:06,000 >> Vendar pa si oglejmo rahlo spremembo te videti 119 00:06:06,000 --> 00:06:09,000 kako se lahko stvari zelo slabo. 120 00:06:09,000 --> 00:06:14,000 Torej, se odobri smo zlorablja stvari več kot le košček v tem zakoniku. 121 00:06:14,000 --> 00:06:17,000 Mi smo samo dodelitev prostora na kup za dveh nizov 122 00:06:17,000 --> 00:06:19,000 dolžina cs50 kamnin, 123 00:06:19,000 --> 00:06:22,000 Tokrat se spomnimo / 0 značaja. 124 00:06:22,000 --> 00:06:25,000 Ampak potem vrgel v super-dolg niz v spomin blok 125 00:06:25,000 --> 00:06:27,000 S, ki kaže, da. 126 00:06:27,000 --> 00:06:30,000 Kakšen vpliv bo to imelo na pomnilniški blok, ki kaže na T? 127 00:06:30,000 --> 00:06:34,000 No, če T opozarja pomnilnika, ki je samo v bližini S, 128 00:06:34,000 --> 00:06:37,000 prihaja tik po njej, 129 00:06:37,000 --> 00:06:39,000 potem bi smo zapisali v delu T. 130 00:06:39,000 --> 00:06:41,000 Naj vodijo te kode. 131 00:06:41,000 --> 00:06:43,000 Poglejte, kaj se je zgodilo. 132 00:06:43,000 --> 00:06:47,000 Strune smo shranjeni v naših blokih kopice tako se zdi, da so se natisne pravilno. 133 00:06:47,000 --> 00:06:49,000 Nič se zdi narobe. 134 00:06:49,000 --> 00:06:52,000 Vendar pa pojdimo nazaj v našo kodo in 135 00:06:52,000 --> 00:06:55,000 zakomentirajte črto, kjer smo kopirati cs50 kamenje 136 00:06:55,000 --> 00:06:59,000 v drugi blok pomnilnika, ki ga je opozoril na t. 137 00:06:59,000 --> 00:07:02,000 Zdaj, ko smo teči ta kodeks, naj mi 138 00:07:02,000 --> 00:07:06,000 Samo glej vsebina prvega bloka pomnilnika natisnite. 139 00:07:06,000 --> 00:07:09,000 Vau, čeprav nismo str izvod 140 00:07:09,000 --> 00:07:12,000 vsi znaki v drugem bloku kup, ena je poudaril, da družba T, 141 00:07:12,000 --> 00:07:15,000 smo dobili natisniti. 142 00:07:15,000 --> 00:07:18,000 Dejansko niz smo polni v naši prvi blok 143 00:07:18,000 --> 00:07:21,000 presegla prvi blok in v drugem bloku, 144 00:07:21,000 --> 00:07:23,000 kar vse se zdi normalno. 145 00:07:23,000 --> 00:07:26,000 Valgrind, čeprav nam pove resnično zgodbo. 146 00:07:26,000 --> 00:07:28,000 Takole. 147 00:07:28,000 --> 00:07:32,000 Vsi so neveljavne bere in piše. 148 00:07:32,000 --> 00:07:36,000 >> Oglejmo si primer druge vrste napake. 149 00:07:36,000 --> 00:07:39,000 Tu bomo naredili nekaj precej nesrečno. 150 00:07:39,000 --> 00:07:41,000 Mi zgrabi prostora za notr na kup, 151 00:07:41,000 --> 00:07:45,000 in smo inicializacije int kazalec - p - da kaže na tem prostoru. 152 00:07:45,000 --> 00:07:48,000 Kljub temu, da se inicializira naša kazalec, 153 00:07:48,000 --> 00:07:52,000 podatki, ki jih je, ki kažejo, da je prav, ne glede smeti so v tem delu kup. 154 00:07:52,000 --> 00:07:55,000 Torej, ko smo naložili, da se podatki v int i, 155 00:07:55,000 --> 00:07:57,000 smo tehnično i inicializirati, 156 00:07:57,000 --> 00:08:00,000 vendar smo storili z junk podatkov. 157 00:08:00,000 --> 00:08:03,000 Razpis za uveljavljanje, kar je priročno debugging makro 158 00:08:03,000 --> 00:08:06,000 opredeljeno v aptly imenovan uveljavlja knjižnici 159 00:08:06,000 --> 00:08:09,000 boste prekinili program, če je njen preizkus pogoja ne uspe. 160 00:08:09,000 --> 00:08:11,000 To pomeni, da če jaz ne 0. 161 00:08:11,000 --> 00:08:14,000 Glede na to, kaj je bilo v kup prostora, je povedal, da ga p, 162 00:08:14,000 --> 00:08:18,000 ta program se lahko včasih dela in ne v drugih obdobjih. 163 00:08:18,000 --> 00:08:20,000 Če to deluje, bomo ravno srečen. 164 00:08:20,000 --> 00:08:24,000 Prevajalnik ne bo ujel to napako, vendar je prepričan, da bo Valgrind. 165 00:08:24,000 --> 00:08:28,000 Tam smo videli napako, ki izvira iz naše uporabe, ki junk podatkov. 166 00:08:28,000 --> 00:08:32,000 >> Ko dodelitev kup pomnilnika, vendar ne Drugače pridijeliti ali osvoboditi, 167 00:08:32,000 --> 00:08:34,000 , ki se imenuje pušča. 168 00:08:34,000 --> 00:08:37,000 Za majhno, kratkotrajno programa, ki se zažene in takoj izhode 169 00:08:37,000 --> 00:08:39,000 pušča precej neškodljiva, 170 00:08:39,000 --> 00:08:42,000 ampak za projekt večje velikosti in / ali dolgoživosti, 171 00:08:42,000 --> 00:08:46,000 lahko celo majhna puščanja sestavljena v nekaj velikega. 172 00:08:46,000 --> 00:08:49,000 Za CS50, mi pričakujemo, da boste 173 00:08:49,000 --> 00:08:51,000 poskrbimo za sprostitev vseh kup pomnilnika, ki ga dodeli, 174 00:08:51,000 --> 00:08:54,000 saj želimo graditi znanje za pravilno ravnanje ročni postopek 175 00:08:54,000 --> 00:08:56,000 zahteva C. 176 00:08:56,000 --> 00:08:59,000 Če želite to narediti, mora vaš program ima točno 177 00:08:59,000 --> 00:09:03,000 one-to-one korespondenca med knjižnične funkcije malloc in brezplačne klice. 178 00:09:03,000 --> 00:09:06,000 Na srečo, lahko Valgrind vam pomaga s pomnilniške uhajanja preveč. 179 00:09:06,000 --> 00:09:09,000 Tukaj je utor program, imenovan leak.c, ki dodeljuje 180 00:09:09,000 --> 00:09:13,000 prostora na kup, piše na njej, vendar ga ne osvobodi. 181 00:09:13,000 --> 00:09:16,000 Uspelo nam je zbrati z znamko in ga voziti v Valgrind, 182 00:09:16,000 --> 00:09:18,000 in vidimo, da čeprav nimamo spomin napak, 183 00:09:18,000 --> 00:09:20,000 imamo 1 puščanje. 184 00:09:20,000 --> 00:09:23,000 Obstaja 16 bajtov zagotovo izgubil, 185 00:09:23,000 --> 00:09:27,000 kar pomeni, da je kazalec na ta spomin ni bil v področje, ko se program izstopilo. 186 00:09:27,000 --> 00:09:30,000 Zdaj, Valgrind nam ne daje tone informacij o puščanja, 187 00:09:30,000 --> 00:09:35,000 ampak, če sledimo tej mali, upoštevajte, da se daje dol na dnu svoje poročilo 188 00:09:35,000 --> 00:09:38,000 za ponovno z - puščanja preverite = polna 189 00:09:38,000 --> 00:09:41,000 da bi videli vse podrobnosti ušli spominu, 190 00:09:41,000 --> 00:09:44,000 bomo dobili več informacij. 191 00:09:44,000 --> 00:09:46,000 Zdaj, v kup povzamemo, 192 00:09:46,000 --> 00:09:50,000 Valgrind nam pove kje je spomin, ki je izgubil prvotno dodeljeni. 193 00:09:50,000 --> 00:09:52,000 Tako kot vemo iz pogledate v izvorno kodo, 194 00:09:52,000 --> 00:09:55,000 Valgrind nam sporoča, da smo ušli spomin 195 00:09:55,000 --> 00:09:58,000 dodeljena s pozivom k knjižnične funkcije malloc na spletu 8 leak.c 196 00:09:58,000 --> 00:10:00,000 v glavnem funkcijo. 197 00:10:00,000 --> 00:10:02,000 Precej eleganten. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind razvršča uhajanje z uporabo te pogoje: 199 00:10:04,000 --> 00:10:07,000 Zagotovo izgubili - to je kup dodeljen pomnilnik 200 00:10:07,000 --> 00:10:10,000 je program nima več kazalec. 201 00:10:10,000 --> 00:10:14,000 Valgrind ve, da si nekoč imel kazalec, vendar je od takrat izgubil sled za njim. 202 00:10:14,000 --> 00:10:17,000 Ta spomin je zagotovo ušli. 203 00:10:17,000 --> 00:10:20,000 Posredno izgubili - to je kup dodeljen pomnilnik 204 00:10:20,000 --> 00:10:24,000 katerih edini kazalci na njem so tudi izgubili. 205 00:10:24,000 --> 00:10:27,000 Na primer, če si izgubil kazalec na prvo vozlišče povezan seznam, 206 00:10:27,000 --> 00:10:30,000 potem bi se prvi vozel sama dokončno izgubil, 207 00:10:30,000 --> 00:10:34,000 medtem ko bodo vse nadaljnje vozlišča posredno izgubljena. 208 00:10:34,000 --> 00:10:37,000 Predvidoma izgubili - to je kup dodeljen pomnilnik 209 00:10:37,000 --> 00:10:41,000 ki Valgrind ne morejo biti prepričani, ali je kazalec ali ne. 210 00:10:41,000 --> 00:10:44,000 Še vedno dosegljiva, je kup dodeljen pomnilnik 211 00:10:44,000 --> 00:10:47,000 je program še vedno kazalec na izhod, 212 00:10:47,000 --> 00:10:50,000 kar običajno pomeni, da je globalna spremenljivka kaže na to. 213 00:10:50,000 --> 00:10:53,000 Če želite preveriti te tesnjenje, boste imeli tudi možnost, da se vključi 214 00:10:53,000 --> 00:10:55,000 - Še vedno dosegljiv = da 215 00:10:55,000 --> 00:10:58,000 v vašem sklicevanje na Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Ti različni primeri lahko zahtevajo različne strategije za njihovo čiščenje, 217 00:11:01,000 --> 00:11:05,000 vendar je treba odpraviti pušča. 218 00:11:05,000 --> 00:11:08,000 Na žalost, lahko določitvi uhajanje težko narediti, 219 00:11:08,000 --> 00:11:11,000 saj lahko nepravilna klici na brezplačno razstrelil svoj program. 220 00:11:11,000 --> 00:11:14,000 Na primer, če pogledamo invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 smo videli primer slabega deallocation pomnilnika. 222 00:11:18,000 --> 00:11:21,000 Kakšen bi moral biti en sam klic sprostiti celoten blok 223 00:11:21,000 --> 00:11:24,000 pomnilnika, ki ga je opozoril na int_block, 224 00:11:24,000 --> 00:11:27,000 je namesto tega postane poskus osvoboditi vsako int velika poglavje 225 00:11:27,000 --> 00:11:29,000 v spomin posebej. 226 00:11:29,000 --> 00:11:32,000 To bo katastrofalno propadel. 227 00:11:32,000 --> 00:11:34,000 Boom! Kakšna napaka. 228 00:11:34,000 --> 00:11:36,000 To zagotovo ni dobro. 229 00:11:36,000 --> 00:11:39,000 Če si zaljubljen s to vrsto napake, čeprav, in ne veste, kje iskati, 230 00:11:39,000 --> 00:11:41,000 pade nazaj na vaš novi najboljši prijatelj. 231 00:11:41,000 --> 00:11:44,000 Uganili ste - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, kot vedno, natančno ve, kaj se dogaja. 233 00:11:47,000 --> 00:11:50,000 V alloc in prosti šteje ne ujemajo. 234 00:11:50,000 --> 00:11:52,000 Imamo 1 alloc in 4 osvobaja. 235 00:11:52,000 --> 00:11:55,000 In Valgrind nam tudi pove, kje je prvi prosti slab klic - 236 00:11:55,000 --> 00:11:58,000 1, ki je sprožila Eksplozija - prihaja - 237 00:11:58,000 --> 00:12:00,000 linija 16. 238 00:12:00,000 --> 00:12:03,000 Kot vidite, slabe poziva k brezplačnega so res slabe, 239 00:12:03,000 --> 00:12:05,000 zato vam priporočamo, dajanje v najem vaš programa puščanje 240 00:12:05,000 --> 00:12:08,000 medtem ko delate na pridobivanje funkcionalnost pravilna. 241 00:12:08,000 --> 00:12:12,000 Začni iskanje uhajanja šele potem, ko je vaš program deluje pravilno, 242 00:12:12,000 --> 00:12:14,000 brez kakršnih koli drugih napak. 243 00:12:14,000 --> 00:12:16,000 >> In to je vse, kar imamo za ta video. 244 00:12:16,000 --> 00:12:18,000 Zdaj, kaj še čakaš? 245 00:12:18,000 --> 00:12:21,000 Pojdi teči Valgrind na vaših programih sedaj. 246 00:12:21,000 --> 00:12:25,000 Moje ime je Nate Hardison. To je CS50. [CS50.TV]