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 Ĉi tiu estas CS50, CS50.TV] 4 00:00:07,000 --> 00:00:10,000 Iuj el la plej malfacilaj erarojn en C programoj 5 00:00:10,000 --> 00:00:13,000 venas de la malbona administrado de memoro. 6 00:00:13,000 --> 00:00:15,000 Ekzistas grandega nombro de manieroj ŝraŭbo aĵojn, 7 00:00:15,000 --> 00:00:17,000 inkludante atribui la malĝusta kvanto de memoro, 8 00:00:17,000 --> 00:00:20,000 forgesi pravalorizi variabloj, 9 00:00:20,000 --> 00:00:23,000 skribi antaŭ aŭ post la fino de bufro, 10 00:00:23,000 --> 00:00:25,000 kaj liverante konservi memoron plurfoje. 11 00:00:25,000 --> 00:00:28,000 La simptomoj iras de intermitaj frakasas 12 00:00:28,000 --> 00:00:30,000 al mistere anstataŭigi valoroj, 13 00:00:30,000 --> 00:00:34,000 ofte en lokoj kaj tempoj malproksimaj de la originalo eraro. 14 00:00:34,000 --> 00:00:37,000 Paŭsi la observis problemo reen al la suba radiko 15 00:00:37,000 --> 00:00:39,000 povas defii, 16 00:00:39,000 --> 00:00:42,000 sed feliĉe tie estas helpema programo nomata Valgrind 17 00:00:42,000 --> 00:00:44,000 kiu povas fari multon por helpi. 18 00:00:44,000 --> 00:00:47,000 >> Vi kuras programon sub Valgrind ebligi 19 00:00:47,000 --> 00:00:50,000 vastaj kontrolanta de amaso memoro atribuoj kaj aliroj. 20 00:00:50,000 --> 00:00:53,000 Kiam Valgrind detektas problemo, donas al vi tujan, 21 00:00:53,000 --> 00:00:56,000 rekta informo kiu permesas vin 22 00:00:56,000 --> 00:00:58,000 pli facile trovi kaj ripari la problemon. 23 00:00:58,000 --> 00:01:01,000 Valgrind ankaŭ informojn sur malpli mortiga memoro temoj, 24 00:01:01,000 --> 00:01:04,000 kiel memoro fugoj, atribuante amaso memoro, 25 00:01:04,000 --> 00:01:07,000 kaj forgesante liberigi ĝin. 26 00:01:07,000 --> 00:01:10,000 Kiel nia tradukilo, Clang, en nia debugger, GDB, 27 00:01:10,000 --> 00:01:14,000 Valgrind estas libera programaro, kaj ĝi estas instalita en la aparaton. 28 00:01:14,000 --> 00:01:16,000 Valgrind kuras sur via duuma ruleblan, 29 00:01:16,000 --> 00:01:20,000 ne estas via. c aŭ. h fontkodon dosieroj, 30 00:01:20,000 --> 00:01:23,000 do esti certa vi kompilis supren-ĝis-dato kopion de via programo 31 00:01:23,000 --> 00:01:25,000 uzante Clang aŭ Faru. 32 00:01:25,000 --> 00:01:28,000 Tiam, kurante vian programon sub Valgrind povas esti 33 00:01:28,000 --> 00:01:32,000 tiel simpla kiel ĝuste prefixing la norma programo komando kun la vorto Valgrind, 34 00:01:32,000 --> 00:01:35,000 kiu funkciigas Valgrind kaj kuras la programon ene de ĝi. 35 00:01:35,000 --> 00:01:38,000 Kiam startanta, Valgrind faras iujn kompleksajn 36 00:01:38,000 --> 00:01:41,000 jiggering por agordi la ruleblan por la memoro ĉekoj, 37 00:01:41,000 --> 00:01:44,000 tial ĝi povas preni iom ellitiĝi kaj kurante. 38 00:01:44,000 --> 00:01:48,000 La programo estos tiam ekzekuti kutime, estos multe pli malrapide, 39 00:01:48,000 --> 00:01:52,000 kaj kiam finas, Valgrind presos resumo de lia memoro uzado. 40 00:01:52,000 --> 00:01:58,000 Se ĉiu iras bone, ĝi aspektos tiel: 41 00:01:58,000 --> 00:02:01,000 En ĉi tiu kazo,. / Clean_program 42 00:02:01,000 --> 00:02:04,000 estas la vojo al la programo Mi volas kuri. 43 00:02:04,000 --> 00:02:06,000 Kaj dum ĉi tiu ne preni ajnan argumentoj, 44 00:02:06,000 --> 00:02:09,000 se ĝi faris Mi preferas simple Tack ilin al la fino de la komando kiel kutime. 45 00:02:09,000 --> 00:02:12,000 Pura programo estas nur stulta iom programo mi kreis 46 00:02:12,000 --> 00:02:15,000 ke allocates spaco por bloko de ints sur la havaĵon, 47 00:02:15,000 --> 00:02:19,000 meti iujn valorojn ene de ili, kaj liveras la tuta bloko. 48 00:02:19,000 --> 00:02:23,000 Tio estas kion vi pafi por, neniu eraroj kaj neniu filtras. 49 00:02:23,000 --> 00:02:27,000 >> Alia grava metriko estas la tuteca nombro de bajtoj asignotaj. 50 00:02:27,000 --> 00:02:32,000 Depende de la programo, se via atribuoj estas en la megabajtoj aŭ pli alta, 51 00:02:32,000 --> 00:02:34,000 vi probable faras ion malbonan. 52 00:02:34,000 --> 00:02:37,000 Ĉu vi nenecese stokante duobligas? 53 00:02:37,000 --> 00:02:40,000 Ĉu vi uzas la havaĵo por stokado, kiam estus pli bone uzi la pilo? 54 00:02:40,000 --> 00:02:43,000 Do, memoro eraroj povas esti vere malbone. 55 00:02:43,000 --> 00:02:46,000 La pli malkaŝan karaj kaŭzi espectacular frakasas, 56 00:02:46,000 --> 00:02:49,000 sed eĉ tiam ĝi povas ankoraŭ esti malmola marki 57 00:02:49,000 --> 00:02:51,000 kion ekzakte kondukis al la akcidento. 58 00:02:51,000 --> 00:02:54,000 Pli inside, programo kun memoro eraron 59 00:02:54,000 --> 00:02:56,000 povas ankoraŭ kompili pure 60 00:02:56,000 --> 00:02:58,000 kaj povas ankoraŭ ŝajnas funkcii korekte 61 00:02:58,000 --> 00:03:01,000 ĉar vi sukcesis akiri bonŝanca plejparto de la tempo. 62 00:03:01,000 --> 00:03:04,000 Post pluraj "sukcesa rezultoj," 63 00:03:04,000 --> 00:03:07,000 vi eble simple pensas, ke akcidento estas hazardo de la komputilo, 64 00:03:07,000 --> 00:03:10,000 sed la komputilo estas neniam malĝusta. 65 00:03:10,000 --> 00:03:13,000 >> Kurante Valgrind povas helpi vin spuri la kaŭzo de videbla memoro eraroj 66 00:03:13,000 --> 00:03:18,000 tiel kiel trovi kasxigxas erarojn vi eĉ ne ankoraŭ scias pri. 67 00:03:18,000 --> 00:03:22,000 Ĉiufoje Valgrind detektas problemo, ĝi presas informojn pri kio observas. 68 00:03:22,000 --> 00:03:24,000 Ĉiu ero estas sufiĉe konciza - 69 00:03:24,000 --> 00:03:27,000 la fonto linio de la ofendi instrukcio, kion la demando estas, 70 00:03:27,000 --> 00:03:30,000 kaj iom informoj pri la memoro implikita - 71 00:03:30,000 --> 00:03:34,000 sed ofte ĝi estas sufiĉa informo por direkti vian atenton al la gxusta loko. 72 00:03:34,000 --> 00:03:37,000 Jen ekzemplo de Valgrind kurante en kalesxo programo 73 00:03:37,000 --> 00:03:40,000 kiu faras nevalidan legado de amaso memoro. 74 00:03:40,000 --> 00:03:49,000 Ni ne vidas erarojn aŭ avertojn en kompilaĵo. 75 00:03:49,000 --> 00:03:53,000 Uh-oh, la eraro resumo diras ke estas du eraroj - 76 00:03:53,000 --> 00:03:56,000 du nevalida legas de grandeco 4 - bajtoj, kiu estas. 77 00:03:56,000 --> 00:04:01,000 Ambaŭ malbona legas okazis en la ĉefa funkcio de invalid_read.c, 78 00:04:01,000 --> 00:04:04,000 la unua en linio 16 kaj la dua sur linio 19. 79 00:04:04,000 --> 00:04:06,000 Ni rigardu la kodon. 80 00:04:06,000 --> 00:04:11,000 Aspektas kiel la unua alvoko al printf provas legi unu int preter la fino de nia memoro bloko. 81 00:04:11,000 --> 00:04:13,000 Se ni retrorigardas al Valgrind la eliro, 82 00:04:13,000 --> 00:04:16,000 ni vidas ke Valgrind diris al ni precize tion. 83 00:04:16,000 --> 00:04:19,000 La adreso ni provas legi startas 0 bitokoj 84 00:04:19,000 --> 00:04:22,000 preter la fino de la bloko de grandeco 16 bitokoj - 85 00:04:22,000 --> 00:04:25,000 kvar 32-bitaj ints ke ni destinis. 86 00:04:25,000 --> 00:04:29,000 Tio estas, la adreso ni provis legi komenciĝas ĝuste en la fino de nia bloko, 87 00:04:29,000 --> 00:04:32,000 kiel ni vidas en nia malbona printf alvokon. 88 00:04:32,000 --> 00:04:36,000 Nun, nevalida legas eble ne ŝajnas tiel granda de traktadon, 89 00:04:36,000 --> 00:04:39,000 sed se vi uzas tiu datumo por kontroli la fluon de via programo - 90 00:04:39,000 --> 00:04:42,000 ekzemple, kiel parto de se aserto aŭ buklo - 91 00:04:42,000 --> 00:04:45,000 tiam aĵoj povas silente iri malbone. 92 00:04:45,000 --> 00:04:47,000 Rigardas kiel mi povas kuri la invalid_read programo 93 00:04:47,000 --> 00:04:50,000 kaj nenio el la ordinara okazas. 94 00:04:50,000 --> 00:04:52,000 Timigaj, huh? 95 00:04:52,000 --> 00:04:56,000 >> Nun, ni rigardu iujn pli specoj de eraroj, ke vi povus renkonti en via kodo, 96 00:04:56,000 --> 00:04:59,000 kaj ni vidos kiel Valgrind detektas ilin. 97 00:04:59,000 --> 00:05:01,000 Ni nur vidis ekzemplon de invalid_read, 98 00:05:01,000 --> 00:05:04,000 tial nun ni rigardu la invalid_write. 99 00:05:04,000 --> 00:05:09,000 Denove, ne eraroj aŭ avertojn en kompilaĵo. 100 00:05:09,000 --> 00:05:12,000 Konsentite, Valgrind diras ke estas du eraroj en ĉi tiu programo - 101 00:05:12,000 --> 00:05:15,000 kaj invalid_write kaj invalid_read. 102 00:05:15,000 --> 00:05:18,000 Ni rigardu tiun kodon. 103 00:05:18,000 --> 00:05:21,000 Aspektas kiel ni havas petskribo de la klasika strlen plus unu cimon. 104 00:05:21,000 --> 00:05:24,000 La kodo ne malloc ekstra bajto de spaco 105 00:05:24,000 --> 00:05:26,000 por la / 0 karaktero, 106 00:05:26,000 --> 00:05:30,000 do kiam str kopion iris skribi ĝin ĉe ssubstrlen "cs50 rokoj!" 107 00:05:30,000 --> 00:05:33,000 skribis 1 bajto preter la fino de nia bloko. 108 00:05:33,000 --> 00:05:36,000 La invalid_read venas kiam ni faras nia alvoko al printf. 109 00:05:36,000 --> 00:05:40,000 Printf finas legadon nevalida memoro kiam legas la / 0 karaktero 110 00:05:40,000 --> 00:05:43,000 kiel ĝi aspektas ĉe la fino de ĉi tiu TTT kordoj estas stampita. 111 00:05:43,000 --> 00:05:45,000 Sed neniu el ĉi eskapis Valgrind. 112 00:05:45,000 --> 00:05:48,000 Ni vidas, ke ĝi kaptis la invalid_write kiel parto de la str kopio 113 00:05:48,000 --> 00:05:51,000 on line 11 de ĉefa, kaj la invalid_read estas parto de printf. 114 00:05:51,000 --> 00:05:54,000 Rock plu, Valgrind. 115 00:05:54,000 --> 00:05:57,000 Denove, eble tio ne ŝajnas kiel granda interkonsento. 116 00:05:57,000 --> 00:06:00,000 Ni povas kuri ĉi programo oni kaj ekster Valgrind 117 00:06:00,000 --> 00:06:03,000 kaj ne vidis neniun eraron simptomojn. 118 00:06:03,000 --> 00:06:06,000 >> Tamen, ni rigardu malpeza variado de ĉi por vidi 119 00:06:06,000 --> 00:06:09,000 kiel la aferoj povas akiri vere malbona. 120 00:06:09,000 --> 00:06:14,000 Do, donita, ni trouzi tion pli ol nur iomete en ĉi tiu kodo. 121 00:06:14,000 --> 00:06:17,000 Ni nur atribui spaco sur la havaĵon por du kordoj 122 00:06:17,000 --> 00:06:19,000 la longo de cs50 rokoj, 123 00:06:19,000 --> 00:06:22,000 ĉi tiun fojon, memorante la / 0 karaktero. 124 00:06:22,000 --> 00:06:25,000 Sed tiam ni ĵetu en la super-longa ŝnuro en la memoro bloko 125 00:06:25,000 --> 00:06:27,000 ke S estas indikante. 126 00:06:27,000 --> 00:06:30,000 Kio efekto kiun havas la memoro bloko kiu T punktoj al? 127 00:06:30,000 --> 00:06:34,000 Nu, se T punktoj al la memoro tio estas nur najbara al S, 128 00:06:34,000 --> 00:06:37,000 venas nur post tio, 129 00:06:37,000 --> 00:06:39,000 tiam ni povus havi skribita sur parto de T. 130 00:06:39,000 --> 00:06:41,000 Ni kuras ĉi tiu kodo. 131 00:06:41,000 --> 00:06:43,000 Rigardu kio okazis. 132 00:06:43,000 --> 00:06:47,000 La kordoj ni gardas en nia amaso blokas ambaŭ ŝajnis esti presita ekster ĝuste. 133 00:06:47,000 --> 00:06:49,000 Nenio ŝajnas malĝusta ajn. 134 00:06:49,000 --> 00:06:52,000 Tamen, ni reiru al nia kodo kaj 135 00:06:52,000 --> 00:06:55,000 diri el la linio kie ni kopii cs50 rokoj 136 00:06:55,000 --> 00:06:59,000 en la dua memoro bloko, montradis per t. 137 00:06:59,000 --> 00:07:02,000 Nun, kiam ni kuras ĉi tiu kodo, ke ni devus 138 00:07:02,000 --> 00:07:06,000 nur vidi la enhavon de la unua memoro bloko presi. 139 00:07:06,000 --> 00:07:09,000 Halt, eĉ se ni ne str kopio 140 00:07:09,000 --> 00:07:12,000 neniu signoj al la dua amaso bloko, la montradis per T, 141 00:07:12,000 --> 00:07:15,000 ni preni print out. 142 00:07:15,000 --> 00:07:18,000 Efektive, la kordoj ni plenigita en nia unua bloko 143 00:07:18,000 --> 00:07:21,000 invadis la unua bloko kaj en la dua bloko, 144 00:07:21,000 --> 00:07:23,000 farante cxion ŝajnas normala. 145 00:07:23,000 --> 00:07:26,000 Valgrind, kvankam, diras al ni la veran historion. 146 00:07:26,000 --> 00:07:28,000 Tie ni iru. 147 00:07:28,000 --> 00:07:32,000 Ĉiuj el tiuj nevalida legas kaj skribas. 148 00:07:32,000 --> 00:07:36,000 >> Ni rigardu ekzemplon de alia speco de eraro. 149 00:07:36,000 --> 00:07:39,000 Ĉi tie ni faru ion pli malfeliĉa. 150 00:07:39,000 --> 00:07:41,000 Ni kaptu spaco por int sur la havaĵon, 151 00:07:41,000 --> 00:07:45,000 kaj ni pravalorizi an int puntero - p - atentigi al tiu spaco. 152 00:07:45,000 --> 00:07:48,000 Tamen, dum nia puntero estas inicializada, 153 00:07:48,000 --> 00:07:52,000 la datumoj kiujn ĝi estas indikante nur havas ajn rubo estas en tiu parto de la amaso. 154 00:07:52,000 --> 00:07:55,000 Do kiam ni montru ke la datumoj en int i, 155 00:07:55,000 --> 00:07:57,000 ni teknike pravalorizi i, 156 00:07:57,000 --> 00:08:00,000 sed ni faras tion kun rubo datumoj. 157 00:08:00,000 --> 00:08:03,000 La alvoko por aserti, kiu estas utila depuración macro 158 00:08:03,000 --> 00:08:06,000 difinita en la _aptly_ nomis aserti biblioteko, 159 00:08:06,000 --> 00:08:09,000 volo aborti la programo se ĝia provo kondiĉo maltrafas. 160 00:08:09,000 --> 00:08:11,000 Tio estas, se i estas ne 0. 161 00:08:11,000 --> 00:08:14,000 Depende kio estis en la havaĵo spaco, montradis per p, 162 00:08:14,000 --> 00:08:18,000 tiu programo povus labori kelkfoje kaj fail je aliaj tempoj. 163 00:08:18,000 --> 00:08:20,000 Se ĝi funkcias, ni nur nun bonŝanca. 164 00:08:20,000 --> 00:08:24,000 La tradukilo ne kaptas tiun eraron, sed Valgrind certa volo. 165 00:08:24,000 --> 00:08:28,000 Tie ni vidas la eraron devenaj el nia uzo de tiu rubaĵo datumoj. 166 00:08:28,000 --> 00:08:32,000 >> Kiam vi destini amaso memoro sed ne deallocate ĝin aŭ liberigi ŝin, 167 00:08:32,000 --> 00:08:34,000 kiu estas nomata fugo. 168 00:08:34,000 --> 00:08:37,000 Por malgranda, mallonga programo kiu kuras kaj tuj eliroj, 169 00:08:37,000 --> 00:08:39,000 fugoj estas sufiĉe simplaj, 170 00:08:39,000 --> 00:08:42,000 sed por projekto de granda grandeco kaj / aŭ longevidad, 171 00:08:42,000 --> 00:08:46,000 eĉ malgranda fugo povas komponaĵo en ion grandan. 172 00:08:46,000 --> 00:08:49,000 Por CS50, ni atendas vin 173 00:08:49,000 --> 00:08:51,000 prizorgi liberigante ĉiujn amaso memoro kiun vi destini, 174 00:08:51,000 --> 00:08:54,000 ĉar ni volas ke vi konstruu la kapablecojn por taŭge trakti la manlibro procezo 175 00:08:54,000 --> 00:08:56,000 postulas de C. 176 00:08:56,000 --> 00:08:59,000 Por tion fari, via programo devus havi ĝusta 177 00:08:59,000 --> 00:09:03,000 unu-al-unu rilato inter malloc kaj libera alvokoj. 178 00:09:03,000 --> 00:09:06,000 Feliĉe, Valgrind povas helpi vin kun memoro filtras ankaŭ. 179 00:09:06,000 --> 00:09:09,000 Jen leaky programo nomata leak.c ke allocates 180 00:09:09,000 --> 00:09:13,000 spaco sur la havaĵon, skribas al ĝi, sed ne liberigi ĝin. 181 00:09:13,000 --> 00:09:16,000 Ni kompili ĝin kun Faru kaj ruli ĝin sub Valgrind, 182 00:09:16,000 --> 00:09:18,000 kaj ni vidas ke, dum ni ne havas memoron eraroj, 183 00:09:18,000 --> 00:09:20,000 ni havas unu fugo. 184 00:09:20,000 --> 00:09:23,000 Estas 16 bitokoj definitive perditaj, 185 00:09:23,000 --> 00:09:27,000 signifante ke la montrilo al tiu memoro ne estis en amplekso kiam la programo eliris. 186 00:09:27,000 --> 00:09:30,000 Nun, Valgrind ne donas al ni ton de informoj pri la fugo, 187 00:09:30,000 --> 00:09:35,000 sed se ni sekvas tiun malgrandan noton kiu donas sube al la fundo de lia raporto 188 00:09:35,000 --> 00:09:38,000 al rerun kun - fugon-check = plena 189 00:09:38,000 --> 00:09:41,000 por vidi la plenan detaloj de filtrita memoro, 190 00:09:41,000 --> 00:09:44,000 ni ricevos pli da informoj. 191 00:09:44,000 --> 00:09:46,000 Nun, en la havaĵo resumon, 192 00:09:46,000 --> 00:09:50,000 Valgrind diras al ni kie la memoro, la perditan estis komence asignotaj. 193 00:09:50,000 --> 00:09:52,000 Kiel ni konas el rigardante en la fontkodo, 194 00:09:52,000 --> 00:09:55,000 Valgrind informas nin, ke ni filtris la memoro 195 00:09:55,000 --> 00:09:58,000 asignitaj kun alvoko al malloc sur linio 8 de leak.c 196 00:09:58,000 --> 00:10:00,000 en la ĉefa funkcio. 197 00:10:00,000 --> 00:10:02,000 Bela nifty. 198 00:10:02,000 --> 00:10:04,000 >> Valgrind categoriza filtras uzante tiuj terminoj: 199 00:10:04,000 --> 00:10:07,000 Definitive perdis - tiu ĉi estas amaso asignitaj memoro 200 00:10:07,000 --> 00:10:10,000 al kiu la programo ne plu havas puntero. 201 00:10:10,000 --> 00:10:14,000 Valgrind scias ke vi iam havis la puntero sed tiam miskalkulis ĝin. 202 00:10:14,000 --> 00:10:17,000 Tiu memoro estas definitive filtris. 203 00:10:17,000 --> 00:10:20,000 Nerekte perdis - tiu ĉi estas amaso asignitaj memoro 204 00:10:20,000 --> 00:10:24,000 al kiu la sola punteros al tio ankaŭ estas perditaj. 205 00:10:24,000 --> 00:10:27,000 Ekzemple, se vi perdis vian sagon al la unua nodo de ligitaj listo, 206 00:10:27,000 --> 00:10:30,000 tiam la unua nodo mem estus definitive perditaj, 207 00:10:30,000 --> 00:10:34,000 dum ajna posta nodoj estus malrekte perdita. 208 00:10:34,000 --> 00:10:37,000 Eble perdita - tiu ĉi estas amaso asignitaj memoro 209 00:10:37,000 --> 00:10:41,000 al kiu Valgrind ne povas esti certa ĉu estas puntero aŭ ne. 210 00:10:41,000 --> 00:10:44,000 Ankoraŭ alirebla estas amaso asignitaj memoro 211 00:10:44,000 --> 00:10:47,000 al kiu la programo ankoraŭ havas puntero ĉe eliro, 212 00:10:47,000 --> 00:10:50,000 kiu tipe signifas ke tutmonda variablo punktoj al ĝi. 213 00:10:50,000 --> 00:10:53,000 Por kontroli por tiuj fugoj, vi ankaŭ devas inkluzivi la eblon 214 00:10:53,000 --> 00:10:55,000 - Ankoraŭ-alirebla = jes 215 00:10:55,000 --> 00:10:58,000 en via alvoko de Valgrind. 216 00:10:58,000 --> 00:11:01,000 >> Ĉi tiuj malsamaj kazoj povus postuli malsaman strategioj por purigi ilin, 217 00:11:01,000 --> 00:11:05,000 sed filtras devus esti forigita. 218 00:11:05,000 --> 00:11:08,000 Bedaŭrinde, riparante filtras povas esti malfacile fari, 219 00:11:08,000 --> 00:11:11,000 ekde malĝusta alvokoj al libera povas blovi vian programon. 220 00:11:11,000 --> 00:11:14,000 Ekzemple, se ni rigardas invalid_free.c, 221 00:11:14,000 --> 00:11:18,000 ni vidas ekzemplon de malbona memoro deallocation. 222 00:11:18,000 --> 00:11:21,000 Kio estu sola alvoko liberigi la tutan blokon 223 00:11:21,000 --> 00:11:24,000 de memoro montradis per int_block, 224 00:11:24,000 --> 00:11:27,000 tio anstataŭe fariĝis provo liberigi ĉiun int-sized sekcio 225 00:11:27,000 --> 00:11:29,000 de la memoro individue. 226 00:11:29,000 --> 00:11:32,000 Ĉi malsukcesos catastrophically. 227 00:11:32,000 --> 00:11:34,000 Eksplodo! Kio eraron. 228 00:11:34,000 --> 00:11:36,000 Tiu certe ne estas bona. 229 00:11:36,000 --> 00:11:39,000 Se vi gluata kun ĉi tiu speco de eraro, kvankam, kaj vi ne scias kie serĉi, 230 00:11:39,000 --> 00:11:41,000 replegarse en via nova pli bona amiko. 231 00:11:41,000 --> 00:11:44,000 Vi divenis - Valgrind. 232 00:11:44,000 --> 00:11:47,000 Valgrind, kiel ĉiam, scias ĝuste kio estas supre. 233 00:11:47,000 --> 00:11:50,000 La alloc kaj libera grafoj ne kongruas supren. 234 00:11:50,000 --> 00:11:52,000 Ni havas 1 alloc kaj 4 libera. 235 00:11:52,000 --> 00:11:55,000 Kaj Valgrind ankaŭ diras al ni kie la unua malbona libera alvoko - 236 00:11:55,000 --> 00:11:58,000 kiu deĉenigis la blowup - venas el - 237 00:11:58,000 --> 00:12:00,000 linio 16. 238 00:12:00,000 --> 00:12:03,000 Kiel vi vidas, malbona alvokoj liberigi estas vere malbona, 239 00:12:03,000 --> 00:12:05,000 do ni rekomendas lasi vian programon fugo 240 00:12:05,000 --> 00:12:08,000 dum vi laboras pri atingi la funcionalidad ĝentila. 241 00:12:08,000 --> 00:12:12,000 Start serĉas filtras nur post via programo funkcias adekvate, 242 00:12:12,000 --> 00:12:14,000 sen ajna alia eraroj. 243 00:12:14,000 --> 00:12:16,000 >> Kaj tio estas ĉio ni havas por tiu video. 244 00:12:16,000 --> 00:12:18,000 Nun kion vi atendas? 245 00:12:18,000 --> 00:12:21,000 Iru kuri Valgrind en via programoj nun. 246 00:12:21,000 --> 00:12:25,000 Mia nomo estas Nate Hardison. Ĉi tiu estas CS50. [CS50.TV]