1 00:00:00,000 --> 00:00:00,499 2 00:00:00,499 --> 00:00:01,395 [CHWARAE CERDDORIAETH] 3 00:00:01,395 --> 00:00:05,590 4 00:00:05,590 --> 00:00:07,940 >> DOUG LLOYD: Iawn felly awgrym cyn dechrau yma. 5 00:00:07,940 --> 00:00:11,660 Os nad ydych wedi gwylio'r fideo ar Awgrymiadau efallai y byddwch am wneud hynny yn gyntaf. 6 00:00:11,660 --> 00:00:15,860 Oherwydd bod y fideo hwn yn un arall ffordd o weithio gyda awgrymiadau. 7 00:00:15,860 --> 00:00:17,574 >> Felly, mae'n mynd i siarad am rai cysyniadau 8 00:00:17,574 --> 00:00:19,490 ein bod yn ymdrin yn y awgrymiadau fideo, ac rydym yn 9 00:00:19,490 --> 00:00:21,948 mynd i sglein dros arnynt yn awr, gan dybio eu bod yn barod 10 00:00:21,948 --> 00:00:23,090 fath o deall. 11 00:00:23,090 --> 00:00:25,440 Felly dyna dim ond eich rhybuddio teg os ydych yn gweld y fideo hwn 12 00:00:25,440 --> 00:00:27,814 ac nad ydych wedi gweld y awgrymiadau fideo, y gallai rhyw fath o 13 00:00:27,814 --> 00:00:29,610 hedfan dros eich pen ychydig. 14 00:00:29,610 --> 00:00:32,080 Ac felly efallai y byddai'n well i'w wylio yn y drefn honno. 15 00:00:32,080 --> 00:00:34,710 >> Felly rydym eisoes wedi gweld un ffordd i'r gwaith gyda awgrymiadau, 16 00:00:34,710 --> 00:00:37,810 sef ein ddatgan amrywiol, ac yna rydym yn 17 00:00:37,810 --> 00:00:42,160 ddatgan newidyn arall, pwyntydd amrywiadwy, bod yn cyfeirio at hynny. 18 00:00:42,160 --> 00:00:44,870 Felly, rydym wedi creu amrywiol gydag enw, rydym wedi 19 00:00:44,870 --> 00:00:48,480 creu ail newidyn gydag enw, ac yr ydym yn tynnu sylw bod ail newidyn 20 00:00:48,480 --> 00:00:50,220 bryd hynny gyntaf. 21 00:00:50,220 --> 00:00:52,370 Mae'r math hwn o mae gan broblem fodd bynnag, gan ei fod yn 22 00:00:52,370 --> 00:00:54,650 yn mynnu ein bod yn gwybod yn union faint o gof rydym yn 23 00:00:54,650 --> 00:00:57,600 mynd i angen o bryd mae ein rhaglen yn cael ei llunio. 24 00:00:57,600 --> 00:00:58,220 >> Pam hynny? 25 00:00:58,220 --> 00:01:03,338 Oherwydd mae angen inni allu enwi neu nodi pob un o'r newidynnau posibl 26 00:01:03,338 --> 00:01:04,129 efallai y byddwn yn dod ar draws. 27 00:01:04,129 --> 00:01:07,910 Efallai gennym amrywiaeth a allai fod yn gallu cynnal llawer o wybodaeth, 28 00:01:07,910 --> 00:01:10,110 ond mae'n dal i fod yn yn union yn ddigon manwl gywir. 29 00:01:10,110 --> 00:01:12,640 Beth os nad ydym yn gwybod, beth os nad oes gennym unrhyw syniad 30 00:01:12,640 --> 00:01:14,370 faint y bydd angen i ni ar adeg crynhoi? 31 00:01:14,370 --> 00:01:17,020 Neu beth os bydd ein rhaglen rhedeg am amser hir iawn, 32 00:01:17,020 --> 00:01:19,810 derbyn amrywiol defnyddiwr data, ac ni allwn mewn gwirionedd 33 00:01:19,810 --> 00:01:23,170 amcangyfrif a ydym ni'n mynd i angen 1,000 o unedau? 34 00:01:23,170 --> 00:01:26,060 >> Nid yw'n debyg y gallwn ddweud ar y llinell orchymyn 35 00:01:26,060 --> 00:01:28,040 mynd i mewn faint o eitemau ydych yn meddwl y bydd ei angen arnoch. 36 00:01:28,040 --> 00:01:31,100 Wel beth os mai dyfalu yn anghywir? 37 00:01:31,100 --> 00:01:34,300 Dyrannu cof deinamig fath o yn caniatáu i ni y ffordd 38 00:01:34,300 --> 00:01:36,867 i fynd o amgylch broblem benodol hon. 39 00:01:36,867 --> 00:01:38,700 A'r ffordd mae'n ei wneud yw drwy ddefnyddio awgrymiadau. 40 00:01:38,700 --> 00:01:42,140 >> Gallwn ddefnyddio awgrymiadau i cael mynediad at ddynamig 41 00:01:42,140 --> 00:01:45,710 cof a ddyrannwyd, cof sy'n dyrannu fel eich rhaglen yn rhedeg. 42 00:01:45,710 --> 00:01:48,290 Dyw hi ddim yn dyrannu ar adeg crynhoi. 43 00:01:48,290 --> 00:01:51,570 Pan fyddwch yn ddynamig yn dyrannu cof mae'n dod o gronfa 44 00:01:51,570 --> 00:01:53,795 o gof a elwir yn y domen. 45 00:01:53,795 --> 00:01:56,420 Yn flaenorol yr holl cof rydym wedi bod yn gweithio â hwy yn y cwrs 46 00:01:56,420 --> 00:01:59,920 wedi bod yn dod o gronfa o gof a elwir yn y pentwr. 47 00:01:59,920 --> 00:02:02,470 Ffordd dda o gyffredinol cadw mewn mind-- ac mae hyn yn rheol 48 00:02:02,470 --> 00:02:04,720 nid yw bob amser yn dal yn wir, ond 'n bert lawer bron 49 00:02:04,720 --> 00:02:09,940 bob amser yn dal true-- yw bod unrhyw tro y byddwch yn rhoi enw newidyn ei 50 00:02:09,940 --> 00:02:12,090 yn ôl pob tebyg yn byw ar y corn. 51 00:02:12,090 --> 00:02:14,650 Ac unrhyw amser nad ydych yn ei wneud rhoi newidyn enw, 52 00:02:14,650 --> 00:02:19,160 y gallwch chi ei wneud gyda'r cof deinamig dyrannu, mae'n byw ar y domen. 53 00:02:19,160 --> 00:02:22,190 >> Nawr rwy'n fath o gyflwyno'r hyn fel os oes y ddau bwll o gof. 54 00:02:22,190 --> 00:02:24,740 Ond efallai eich bod wedi gweld hyn diagram, sydd yn gyffredinol 55 00:02:24,740 --> 00:02:27,290 cynrychiolaeth o pa cof edrych fel, 56 00:02:27,290 --> 00:02:30,373 ac nid ydym yn mynd i ofalu am yr holl y pethau ar y top a'r gwaelod. 57 00:02:30,373 --> 00:02:33,580 Yr hyn yr ydym yn gofalu amdano yw y rhan hon mewn y canol yma, tomen a simnai. 58 00:02:33,580 --> 00:02:35,570 Fel y gallwch weld gan gan edrych ar y diagram hwn, 59 00:02:35,570 --> 00:02:38,390 nad yw'r rhain mewn gwirionedd yn ddau pyllau wahân o gof. 60 00:02:38,390 --> 00:02:42,757 Mae'n un pwll a rennir o gof ble fyddwch yn dechrau, yn yr weledol 61 00:02:42,757 --> 00:02:44,590 byddwch yn dechrau ar y gwaelod a dechrau llenwi i fyny 62 00:02:44,590 --> 00:02:48,040 o'r gwaelod gyda'r simnai, ac yr ydych yn dechrau ar y brig ac yn dechrau llenwi i fyny 63 00:02:48,040 --> 00:02:50,072 o'r brig i lawr gyda'r pentwr. 64 00:02:50,072 --> 00:02:51,780 Ond y mae mewn gwirionedd y un gronfa, 'i' jyst 65 00:02:51,780 --> 00:02:56,050 gwahanol smotiau, gwahanol leoliadau er cof sy'n cael eu dyrannu. 66 00:02:56,050 --> 00:02:59,060 A allwch chi rhedeg allan o cof naill ai drwy gael 67 00:02:59,060 --> 00:03:01,240 y domen yn mynd yr holl ffordd i'r gwaelod, neu os oes gennych 68 00:03:01,240 --> 00:03:05,440 y pentwr fynd yr holl ffordd i ben, neu gael y domen a'r pentwr 69 00:03:05,440 --> 00:03:06,740 cwrdd yn erbyn ei gilydd. 70 00:03:06,740 --> 00:03:09,500 Gall pob un o'r rheiny fod amodau sy'n achosi eich rhaglen 71 00:03:09,500 --> 00:03:11,030 rhedeg allan o gof. 72 00:03:11,030 --> 00:03:11,952 Felly cadwch hynny mewn cof. 73 00:03:11,952 --> 00:03:13,660 Pan fyddwn yn sôn am y domen a'r pentwr 74 00:03:13,660 --> 00:03:17,880 rydym yn wir yn siarad am y un darn cyffredinol o gof, dim ond 75 00:03:17,880 --> 00:03:21,930 gwahanol dogn hwnnw cof. 76 00:03:21,930 --> 00:03:24,910 >> Felly sut rydym yn mynd ddeinamig dyrannu cof yn y lle cyntaf? 77 00:03:24,910 --> 00:03:27,740 Sut mae ein rhaglen yn cael cof gan ei fod yn rhedeg? 78 00:03:27,740 --> 00:03:32,660 Wel C yn rhoi swyddogaeth o'r enw malloc, dyrannydd cof, a oedd yn 79 00:03:32,660 --> 00:03:36,810 byddwch yn ffonio i, ac i chi basio mewn faint o bytes o gof a 'ch angen. 80 00:03:36,810 --> 00:03:39,940 Felly os yw eich rhaglen yn rhedeg ac rydych am gael Rhedeg cyfanrif, 81 00:03:39,940 --> 00:03:46,040 efallai y byddwch yn mallock pedwar bytes o cof, cromfachau malloc pedwar. 82 00:03:46,040 --> 00:03:48,540 >> Bydd mallock mynd drwy edrych drwy'r domen, 83 00:03:48,540 --> 00:03:50,750 oherwydd ein bod yn ddynamig dyrannu cof, 84 00:03:50,750 --> 00:03:53,500 a bydd yn dychwelyd atoch pwyntydd i'r cof. 85 00:03:53,500 --> 00:03:56,180 Nid yw'n rhoi bod memory-- i chi nid yw'n rhoi ei enw, 86 00:03:56,180 --> 00:03:57,950 mae'n rhoi pwyntydd iddo chi. 87 00:03:57,950 --> 00:04:00,780 Ac felly dyna pam y dywedais eto ei bod yn bwysig efallai 88 00:04:00,780 --> 00:04:03,770 wedi gwylio'r fideo awgrymiadau cyn i ni fynd yn rhy bell i mewn i hyn. 89 00:04:03,770 --> 00:04:05,940 Felly malloc yn mynd i rhoi chi yn ôl pwyntydd. 90 00:04:05,940 --> 00:04:08,950 >> Os na all mallock roi i chi unrhyw cof am eich bod wedi rhedeg allan, 91 00:04:08,950 --> 00:04:10,645 bydd yn rhoi i chi yn ôl pwyntydd nwl. 92 00:04:10,645 --> 00:04:15,282 Ydych chi'n cofio beth sy'n digwydd os ydym yn ceisio dereference pwyntydd nwl? 93 00:04:15,282 --> 00:04:17,019 Rydym yn dioddef nam SEG, dde? 94 00:04:17,019 --> 00:04:18,060 Dyw hynny ddim yn ôl pob tebyg yn dda. 95 00:04:18,060 --> 00:04:21,579 >> Felly, bob tro y byddwch yn gwneud galwad i malloc chi bob amser, bob amser yn 96 00:04:21,579 --> 00:04:25,270 Mae angen i wirio a yw'r bwyntydd rhoddodd chi yn ôl yn null. 97 00:04:25,270 --> 00:04:28,800 Os ydyw, mae angen i chi i roi terfyn ar eich rhaglen oherwydd os ydych yn ceisio dereference 98 00:04:28,800 --> 00:04:31,360 pwyntydd null rydych yn mynd i ddioddef nam segmentu 99 00:04:31,360 --> 00:04:34,380 a bod eich rhaglen yn mynd i ddamwain beth bynnag. 100 00:04:34,380 --> 00:04:37,190 Felly, sut yr ydym yn llonydd cael yn gyfanrif? 101 00:04:37,190 --> 00:04:37,730 >> int x. 102 00:04:37,730 --> 00:04:40,010 Mae'n debyg y byddwn wedi gwneud hynny bagad o weithiau, dde? 103 00:04:40,010 --> 00:04:43,480 Mae hyn yn creu newidyn enw x sy'n byw ar y corn. 104 00:04:43,480 --> 00:04:46,190 Sut ydym yn ddynamig cael cyfanrif? 105 00:04:46,190 --> 00:04:50,010 Px seren Int hafal malloc 4. 106 00:04:50,010 --> 00:04:53,050 >> Neu yn fwy priodol byddem yn dweud px seren int 107 00:04:53,050 --> 00:04:57,680 yn hafal i faint malloc o int, dim ond i daflu ychydig llai 108 00:04:57,680 --> 00:04:59,740 rhifau hud o gwmpas ein rhaglen. 109 00:04:59,740 --> 00:05:04,140 Mae hyn yn mynd i gael i ni pedwar bytes o gof o'r domen, 110 00:05:04,140 --> 00:05:06,720 ac mae'r pwyntydd rydym yn cael yn ôl i mae'n cael ei alw'n px. 111 00:05:06,720 --> 00:05:08,430 Ac yna yn union fel rydym wedi wneud yn flaenorol rydym yn 112 00:05:08,430 --> 00:05:13,966 gall dereference px i gael gafael ar y cof. 113 00:05:13,966 --> 00:05:15,590 Sut mae cael cyfanrif gan y defnyddiwr? 114 00:05:15,590 --> 00:05:17,970 Gallwn ddweud int x hafal gael int. 115 00:05:17,970 --> 00:05:19,930 Dyna 'n bert syml. 116 00:05:19,930 --> 00:05:24,030 Beth os ydym am greu amrywiaeth o x fflotiau sy'n byw ar y pentwr? 117 00:05:24,030 --> 00:05:28,210 arnofio stack_array-- dyna'r enw o'n cromfachau sgwâr array-- x. 118 00:05:28,210 --> 00:05:32,419 Bydd hynny'n creu i ni amrywiaeth o x fflotiau sy'n byw ar y corn. 119 00:05:32,419 --> 00:05:34,960 Gallwn greu amrywiaeth o fflotiau sy'n byw ar y domen, hefyd. 120 00:05:34,960 --> 00:05:37,330 Efallai y bydd y gystrawen yn edrych yn ychydig yn fwy feichus, 121 00:05:37,330 --> 00:05:41,740 ond gallwn ddweud arnofio heap_array seren yn dychwelyd 122 00:05:41,740 --> 00:05:44,360 malloc x gwaith maint y fflôt. 123 00:05:44,360 --> 00:05:48,160 Mae angen digon o le i mi i ddal x fel y bo'r angen gwerthoedd pwynt. 124 00:05:48,160 --> 00:05:51,560 Felly, yn dweud mae angen i mi 100 arnofion, neu 1,000 o fflotiau. 125 00:05:51,560 --> 00:05:54,810 Felly, yn yr achos hwnnw byddai'n 400 bytes ar gyfer 100 fflotiau, 126 00:05:54,810 --> 00:05:59,080 neu 4,000 bytes ar gyfer 1,000 o fflotiau, oherwydd bod gan bob fflôt yn cymryd i fyny 127 00:05:59,080 --> 00:06:01,230 pedwar bytes o ofod. 128 00:06:01,230 --> 00:06:05,110 >> Ar ôl gwneud hyn gallaf ddefnyddio'r cystrawen braced sgwâr ar heap_array. 129 00:06:05,110 --> 00:06:08,970 Yn union fel yr wyf y byddai ar stack_array, yr wyf yn yn gallu cael mynediad ei elfennau unigol 130 00:06:08,970 --> 00:06:11,590 gan ddefnyddio heap_array sero, un heap_array. 131 00:06:11,590 --> 00:06:15,800 Ond dwyn i gof y rheswm y gallwn ni wneud hynny oherwydd bod y enw amrywiaeth yn C 132 00:06:15,800 --> 00:06:19,990 mewn gwirionedd yn pwyntydd i elfen gyntaf y casgliad yn. 133 00:06:19,990 --> 00:06:23,480 Felly mae'r ffaith ein bod yn datgan amrywiaeth o fflotiau ar y corn yma 134 00:06:23,480 --> 00:06:24,810 mewn gwirionedd ychydig yn gamarweiniol. 135 00:06:24,810 --> 00:06:27,600 Rydym mewn gwirionedd yn y ail linell o god yno 136 00:06:27,600 --> 00:06:32,360 hefyd yn creu pwyntydd i darn o cof yr ydym wedyn yn gwneud rhywfaint o waith gyda. 137 00:06:32,360 --> 00:06:35,620 >> Heres '' r broblem fawr gyda dyrannu cof er ddeinamig, 138 00:06:35,620 --> 00:06:38,360 a dyma pam mae'n wirioneddol bwysig i ddatblygu rhai arferion da 139 00:06:38,360 --> 00:06:39,800 pan fyddwch yn gweithio gydag ef. 140 00:06:39,800 --> 00:06:43,060 Yn wahanol i ddatgan llonydd cof, eich cof 141 00:06:43,060 --> 00:06:46,790 Nid ei ddychwelyd yn awtomatig i'r system pan fydd eich swyddogaeth yn cael ei wneud. 142 00:06:46,790 --> 00:06:49,280 Felly, os oes gennym brif, ac prif galw swyddogaeth 143 00:06:49,280 --> 00:06:53,860 f, pan f gorffeniadau beth bynnag mae'n ei wneud ac yn dychwelyd rheolaeth y rhaglen 144 00:06:53,860 --> 00:06:58,810 yn ôl i'r brif, pob un o'r cof bod f a ddefnyddir yn cael ei roi yn ôl. 145 00:06:58,810 --> 00:07:01,250 Gellir ei ddefnyddio eto gan rai rhaglenni eraill, 146 00:07:01,250 --> 00:07:04,250 neu ryw swyddogaeth arall sydd yn cael ei alw yn ddiweddarach yn brif. 147 00:07:04,250 --> 00:07:06,970 Gall ddefnyddio yr un cof ar ôl tro. 148 00:07:06,970 --> 00:07:09,620 >> Os ydych yn ddynamig dyrannu cof er 149 00:07:09,620 --> 00:07:14,380 rhaid i chi ddweud yn benodol y system sy'n rydych yn ei wneud ag ef. 150 00:07:14,380 --> 00:07:18,370 Bydd yn dal eu gafael ar hynny ar eich rhan, a allai yn arwain at broblem yr ydych yn rhedeg allan 151 00:07:18,370 --> 00:07:19,290 o gof. 152 00:07:19,290 --> 00:07:22,179 Ac yn wir yr ydym weithiau yn cyfeirio at hyn fel yn gollwng cof. 153 00:07:22,179 --> 00:07:24,970 Ac weithiau gollwng cof hyn Gall mewn gwirionedd fod yn wirioneddol ddinistriol 154 00:07:24,970 --> 00:07:27,020 ar gyfer perfformiad system. 155 00:07:27,020 --> 00:07:31,120 >> Os ydych yn ddefnyddiwr y rhyngrwyd yn aml Efallai y byddwch yn defnyddio rhai porwyr gwe, 156 00:07:31,120 --> 00:07:35,630 ac nid wyf am enwi enwau yma, ond mae rhai porwyr gwe allan yna 157 00:07:35,630 --> 00:07:39,150 sydd yn enwog am gael mewn gwirionedd ollyngiadau cof nad ydynt yn cael eu gosod. 158 00:07:39,150 --> 00:07:44,570 Ac os byddwch yn gadael eich porwr agored am gyfnod hir iawn o amser, dyddiau 159 00:07:44,570 --> 00:07:48,060 a diwrnod, neu wythnosau, byddwch weithiau Efallai sylwi bod eich system 160 00:07:48,060 --> 00:07:49,790 yn rhedeg yn iawn, iawn yn araf. 161 00:07:49,790 --> 00:07:54,640 A'r rheswm am hynny yw bod mae'r porwr wedi dyrannu cof, 162 00:07:54,640 --> 00:07:57,320 ond yna nid wrth y system ei fod yn ei wneud ag ef. 163 00:07:57,320 --> 00:08:01,000 Ac felly mae hynny'n gadael llai o gof ar gael ar gyfer eich holl raglenni eraill 164 00:08:01,000 --> 00:08:04,480 i gael i rannu, oherwydd eich bod yn leaking-- y porwr gwe 165 00:08:04,480 --> 00:08:06,755 rhaglen yn gollwng cof. 166 00:08:06,755 --> 00:08:08,880 Sut ydym yn rhoi gof yn ôl pan fyddwn ni'n ei wneud ag ef? 167 00:08:08,880 --> 00:08:10,838 Wel yn ffodus ei fod yn ffordd hawdd iawn i wneud hynny. 168 00:08:10,838 --> 00:08:11,710 Rydym yn unig rhyddhau ei. 169 00:08:11,710 --> 00:08:15,020 Mae 'na swyddogaeth a elwir yn rhad ac am ddim, mae'n derbyn pwyntydd i gof, 170 00:08:15,020 --> 00:08:16,010 ac rydym yn dda i fynd. 171 00:08:16,010 --> 00:08:18,310 >> Felly, gadewch i ni ddweud ein bod yn y nghanol ein rhaglen, 172 00:08:18,310 --> 00:08:21,970 rydym am malloc 50 cymeriadau. 173 00:08:21,970 --> 00:08:25,710 Rydym am malloc amrywiaeth y gall gallu dal 50 o gymeriadau. 174 00:08:25,710 --> 00:08:29,109 A phan fyddwn yn cael pwyntydd yn ôl i hynny, enw sy'n pwyntydd yn air. 175 00:08:29,109 --> 00:08:30,900 Rydym yn gwneud beth bynnag rydym yn mynd i'w wneud gyda'r geiriau, 176 00:08:30,900 --> 00:08:33,440 ac yna pan fyddwn ni'n wneud rydym yn unig am ddim iddo. 177 00:08:33,440 --> 00:08:37,460 Ac yn awr rydym wedi dychwelyd 50 y rhai bytes o gof yn ôl i'r system. 178 00:08:37,460 --> 00:08:40,147 Gall rhai swyddogaeth arall yn eu defnyddio. 179 00:08:40,147 --> 00:08:43,480 Nid oes rhaid i chi boeni am dioddef gollwng cof am ein bod wedi rhyddhau gair. 180 00:08:43,480 --> 00:08:46,639 Rydyn ni wedi cael y cof yn ôl, felly rydym chi wedi gorffen gweithio ag ef. 181 00:08:46,639 --> 00:08:48,430 Felly mae tri rheolau aur y dylai 182 00:08:48,430 --> 00:08:51,700 cael eu cadw mewn cof pryd bynnag y byddwch chi'n dyrannu cof ddeinamig 183 00:08:51,700 --> 00:08:52,990 gyda malloc. 184 00:08:52,990 --> 00:08:56,480 Mae pob bloc o cof bod byddwch malloc rhaid eu rhyddhau 185 00:08:56,480 --> 00:08:58,430 cyn eich rhaglen yn gorffen rhedeg. 186 00:08:58,430 --> 00:09:02,029 Yn awr eto, yn y peiriant neu yn y IDE hwn yn fath o yn digwydd i chi beth bynnag 187 00:09:02,029 --> 00:09:04,820 pan you-- bydd hyn yn digwydd beth bynnag pan fydd eich rhaglen yn cael ei derfynu, 188 00:09:04,820 --> 00:09:06,880 bydd yr holl y cof yn cael ei ryddhau. 189 00:09:06,880 --> 00:09:10,750 Ond mae'n codio gyffredinol dda ymarfer i bob amser, pan fyddwch chi'n ei wneud, 190 00:09:10,750 --> 00:09:13,810 rhad ac am ddim yr hyn yr ydych wedi mallocd. 191 00:09:13,810 --> 00:09:16,690 >> Wedi dweud hynny, dim ond pethau sy'n eich bod wedi Dylid mallocd gael ei ryddhau. 192 00:09:16,690 --> 00:09:19,880 Os byddwch yn datgan llonydd yn cyfanrif, int x hanner colon, 193 00:09:19,880 --> 00:09:23,500 sy'n byw ar y simnai, yr ydych Nid oes yna eisiau x am ddim. 194 00:09:23,500 --> 00:09:25,970 Felly dim ond y pethau yr ydych wedi Dylai mallocd gael ei ryddhau. 195 00:09:25,970 --> 00:09:28,960 >> Ac yn olaf, nid gwneud rhywbeth am ddim ddwywaith. 196 00:09:28,960 --> 00:09:31,170 Gall hynny arwain at sefyllfa rhyfedd arall. 197 00:09:31,170 --> 00:09:33,530 Felly popeth yr ydych wedi mallocd wedi i gael ei ryddhau. 198 00:09:33,530 --> 00:09:36,000 Dim ond y pethau yr ydych wedi Dylid malloc gael ei ryddhau. 199 00:09:36,000 --> 00:09:38,730 Ac nid gwneud rhywbeth am ddim ddwywaith. 200 00:09:38,730 --> 00:09:43,660 >> Felly gadewch i ni fynd drwy esiampl yma o'r hyn y mae rhai ddyrannwyd ddeinamig 201 00:09:43,660 --> 00:09:46,122 Efallai y cof yn edrych fel cymysg mewn gyda rhai cof statig. 202 00:09:46,122 --> 00:09:47,080 Beth allai ddigwydd yma? 203 00:09:47,080 --> 00:09:48,913 Gwelwch os gallwch ddilyn ar hyd a dyfalu beth sydd 204 00:09:48,913 --> 00:09:51,720 mynd i ddigwydd wrth i ni fynd trwy'r holl y llinellau hyn o god. 205 00:09:51,720 --> 00:09:53,980 >> Felly, rydym yn dweud int m. 206 00:09:53,980 --> 00:09:54,840 Beth sy'n digwydd yma? 207 00:09:54,840 --> 00:09:56,339 Wel mae hyn yn eithaf syml. 208 00:09:56,339 --> 00:09:59,650 Yr wyf yn creu newidyn cyfanrif a elwir m. 209 00:09:59,650 --> 00:10:01,400 Rwyf liw gwyrdd, oherwydd dyna y lliw 210 00:10:01,400 --> 00:10:03,730 fy mod yn ei ddefnyddio pan dwi'n siarad am newidynnau cyfanrif. 211 00:10:03,730 --> 00:10:05,160 Mae'n blwch. 212 00:10:05,160 --> 00:10:08,400 Mae'n cael ei alw m, ac rydych yn gallu gyfanrifau storio tu mewn iddo. 213 00:10:08,400 --> 00:10:12,400 >> Beth os byddaf wedyn yn dweud seren int a? 214 00:10:12,400 --> 00:10:13,530 Wel mae hynny'n eithaf tebyg. 215 00:10:13,530 --> 00:10:15,780 Im 'yn creu bocs o'r enw. 216 00:10:15,780 --> 00:10:19,100 Mae'n gallu int daliad sêr, awgrymiadau i gyfanrifau. 217 00:10:19,100 --> 00:10:21,570 Felly rwy'n liwio yn wyrdd-ish hefyd. 218 00:10:21,570 --> 00:10:24,140 >> Yr wyf yn gwybod ei fod wedi rywbeth i'w wneud gyda cyfanrif, 219 00:10:24,140 --> 00:10:25,852 ond nid ei hun ei fod yn gyfanrif. 220 00:10:25,852 --> 00:10:27,310 Ond mae'n 'n bert lawer yr un syniad. 221 00:10:27,310 --> 00:10:28,101 Rydw i wedi creu bocs. 222 00:10:28,101 --> 00:10:30,070 Mae'r ddau o'r rhain hawl yn awr yn byw ar y corn. 223 00:10:30,070 --> 00:10:32,520 Rydw i wedi rhoi y ddau enw iddynt. 224 00:10:32,520 --> 00:10:36,750 >> seren int b yn cyfateb maint malloc o int. 225 00:10:36,750 --> 00:10:38,560 Gallai hyn un fod ychydig yn anodd. 226 00:10:38,560 --> 00:10:44,110 Cymerwch eiliad ac yn meddwl am yr hyn yr ydych Byddai disgwyl i ddigwydd ar y diagram hwn. 227 00:10:44,110 --> 00:10:50,210 seren int b yn cyfateb maint malloc o int. 228 00:10:50,210 --> 00:10:51,940 >> Wel nid yw hyn yn unig yn creu un blwch. 229 00:10:51,940 --> 00:10:53,800 Mae hyn mewn gwirionedd yn creu dau flwch. 230 00:10:53,800 --> 00:10:58,670 Ac mae'n clymu, mae hefyd yn sefydlu pwynt mewn perthynas. 231 00:10:58,670 --> 00:11:02,240 Rydym wedi dyrannu un bloc o gof ar y domen. 232 00:11:02,240 --> 00:11:05,940 Sylwch fod y blwch uchaf ar y dde yna nid oes gan enw. 233 00:11:05,940 --> 00:11:06,760 >> Rydym yn mallocd ef. 234 00:11:06,760 --> 00:11:08,050 Mae'n bodoli ar y domen. 235 00:11:08,050 --> 00:11:10,090 Ond b Mae gan enw. 236 00:11:10,090 --> 00:11:11,950 Mae'n newidyn pwyntydd o'r enw b. 237 00:11:11,950 --> 00:11:13,910 Sy'n byw ar y pentwr. 238 00:11:13,910 --> 00:11:18,250 >> Felly mae'n ddarn o gof sy'n cyfeirio at un arall. 239 00:11:18,250 --> 00:11:21,840 b yn cynnwys y cyfeiriad y bloc o cof. 240 00:11:21,840 --> 00:11:23,757 Nid oes ganddo enw fel arall. 241 00:11:23,757 --> 00:11:24,590 Ond mae'n cyfeirio ato. 242 00:11:24,590 --> 00:11:29,760 Felly, pan ddywedwn seren int b hafal maint malloc o int, yr hawl honno yno, 243 00:11:29,760 --> 00:11:33,490 y saeth a popped i fyny ar y ochr dde yno, bod holl beth, 244 00:11:33,490 --> 00:11:36,740 Bydd rhaid i mi iddo ymddangos eto, yw beth sy'n digwydd. 245 00:11:36,740 --> 00:11:39,341 Mae hynny i gyd yn digwydd mewn y llinell o god. 246 00:11:39,341 --> 00:11:41,340 Nawr byddwn yn cael ychydig yn fwy syml eto. 247 00:11:41,340 --> 00:11:43,330 yn hafal ampersand m. 248 00:11:43,330 --> 00:11:46,280 Ydych chi'n cofio beth yw yn hafal i ampersand m yw? 249 00:11:46,280 --> 00:11:48,920 Wel dyna yn cael cyfeiriad m yn. 250 00:11:48,920 --> 00:11:54,150 Neu rhoi mwy diagram, pwyntiau i m. 251 00:11:54,150 --> 00:11:56,360 >> yn hafal b. 252 00:11:56,360 --> 00:11:57,560 Iawn felly dyma un arall. 253 00:11:57,560 --> 00:11:59,230 A hafal b. 254 00:11:59,230 --> 00:12:02,260 Beth sy'n mynd i ddigwydd at y diagram y tro hwn? 255 00:12:02,260 --> 00:12:04,330 >> Wel cofio bod y gwaith gweithredwr aseiniad 256 00:12:04,330 --> 00:12:08,960 drwy aseinio gwerth ar y hawl i werth ar y chwith. 257 00:12:08,960 --> 00:12:14,820 Felly, yn lle pwyntio at m, yn awr yn cyfeirio at yr un lle y b bwyntiau. 258 00:12:14,820 --> 00:12:18,900 nid yw ddim yn pwyntio ib, a pwyntiau lle b bwyntiau. 259 00:12:18,900 --> 00:12:25,280 >> Os yw pigfain ib y byddai wedi bod yn hafal ampersand b. 260 00:12:25,280 --> 00:12:28,150 Ond yn hytrach yn dychwelyd b unig yn golygu bod a a b yn awr 261 00:12:28,150 --> 00:12:31,770 gan dynnu sylw at yr un cyfeiriad, gan fod tu mewn b yn unig yw gyfeiriad. 262 00:12:31,770 --> 00:12:35,004 Ac yn awr y tu mewn o yn yr un cyfeiriad. 263 00:12:35,004 --> 00:12:37,170 m hafal 10, yn ôl pob tebyg y y rhan fwyaf o beth syml 264 00:12:37,170 --> 00:12:38,690 rydym wedi ei wneud mewn ychydig bach. 265 00:12:38,690 --> 00:12:40,460 Rhowch y 10 yn y blwch. 266 00:12:40,460 --> 00:12:45,640 Star b hafal m ynghyd â 2, dwyn i gof o ein pa seren awgrymiadau fideo b olygu. 267 00:12:45,640 --> 00:12:50,230 Rydym yn mynd i dereference b a'i roi rhywfaint o werth yn y lleoliad hwnnw cof. 268 00:12:50,230 --> 00:12:51,860 Yn yr achos hwn 12. 269 00:12:51,860 --> 00:12:55,300 >> Felly, pan fyddwn yn dereference pwynt o galw i gof rydym yn unig yn teithio i lawr y saeth. 270 00:12:55,300 --> 00:12:58,205 Neu mewn geiriau eraill, yr ydym yn mynd i'r cyfeiriad hwnnw cof 271 00:12:58,205 --> 00:12:59,580 ac yr ydym yn trin mewn rhyw ffordd. 272 00:12:59,580 --> 00:13:00,830 Rydym yn rhoi rhywfaint o werth mewn 'na. 273 00:13:00,830 --> 00:13:03,960 Yn yr achos hwn seren b yn hafal i m a 2 yn unig 274 00:13:03,960 --> 00:13:08,230 mynd i'r newidyn tynnu sylw atynt gan b, mynd i'r cof yn tynnu sylw at y b, 275 00:13:08,230 --> 00:13:11,750 ac yn rhoi m ynghyd â 2 mewn 'na, 12. 276 00:13:11,750 --> 00:13:14,970 >> Nawr rwy'n rhyddhau b. 277 00:13:14,970 --> 00:13:16,490 Beth fydd yn digwydd pan fyddaf yn rhad ac am ddim b? 278 00:13:16,490 --> 00:13:18,800 Cofiwch yr hyn a ddywedais yn golygu rhad ac am ddim. 279 00:13:18,800 --> 00:13:21,920 Beth ydw i'n ei ddweud pan fyddaf yn rhad ac am ddim b? 280 00:13:21,920 --> 00:13:23,410 >> Dwi'n ei wneud yn gweithio ag ef, dde? 281 00:13:23,410 --> 00:13:25,702 Yr wyf yn y bôn rhoi'r gorau i'r cof. 282 00:13:25,702 --> 00:13:26,910 Wyf yn ei roi yn ôl i'r system. 283 00:13:26,910 --> 00:13:33,010 Nid oes angen hyn anymore myfi yr hyn rwy'n dweud wrthyn nhw, OK? 284 00:13:33,010 --> 00:13:37,390 >> Nawr, os wyf yn dweud seren a yn hafal i 11 mae'n debyg y gallwch 285 00:13:37,390 --> 00:13:40,460 eisoes yn dweud bod rhywbeth drwg yn mynd i ddigwydd yma, dde? 286 00:13:40,460 --> 00:13:44,160 Ac yn wir os wyf yn ceisio fy mod yn ôl pob tebyg Byddai dioddef nam segmentu. 287 00:13:44,160 --> 00:13:47,140 Oherwydd erbyn hyn, er bod yn flaenorol darn sydd o gof 288 00:13:47,140 --> 00:13:50,220 yn rhywbeth y bu'n rhaid i mi mynediad at, yn y fan hon 289 00:13:50,220 --> 00:13:54,590 erbyn hyn rwy'n cael mynediad cof bod Nid yn gyfreithlon i mi i gael mynediad. 290 00:13:54,590 --> 00:13:57,330 >> Ac fel y byddwn yn ôl pob tebyg galw i gof, pan fyddwn yn cael mynediad cof 291 00:13:57,330 --> 00:14:00,000 nad ydym yn fod i gyffwrdd, dyna yr achos mwyaf cyffredin 292 00:14:00,000 --> 00:14:01,860 o segmentiad fai. Ac felly mae fy rhaglen 293 00:14:01,860 --> 00:14:05,170 Byddai damwain os wyf yn ceisio gwneud hyn. 294 00:14:05,170 --> 00:14:09,910 Felly unwaith eto mae'n syniad da cael dda arfer ac yn dda arferion rhan annatod 295 00:14:09,910 --> 00:14:12,920 wrth weithio gyda malloc ac am ddim, fel na fyddwch yn dioddef segmentu 296 00:14:12,920 --> 00:14:15,310 namau chi, ac yn eu defnyddio eich ddyrannu ddeinamig 297 00:14:15,310 --> 00:14:17,370 cof yn gyfrifol. 298 00:14:17,370 --> 00:14:20,300 >> Rwy'n Doug Lloyd mae hyn yn CS50. 299 00:14:20,300 --> 00:14:21,947