[CHWARAE CERDDORIAETH] DOUG LLOYD: Iawn felly awgrym cyn dechrau yma. Os nad ydych wedi gwylio'r fideo ar Awgrymiadau efallai y byddwch am wneud hynny yn gyntaf. Oherwydd bod y fideo hwn yn un arall ffordd o weithio gyda awgrymiadau. Felly, mae'n mynd i siarad am rai cysyniadau ein bod yn ymdrin yn y awgrymiadau fideo, ac rydym yn mynd i sglein dros arnynt yn awr, gan dybio eu bod yn barod fath o deall. Felly dyna dim ond eich rhybuddio teg os ydych yn gweld y fideo hwn ac nad ydych wedi gweld y awgrymiadau fideo, y gallai rhyw fath o hedfan dros eich pen ychydig. Ac felly efallai y byddai'n well i'w wylio yn y drefn honno. Felly rydym eisoes wedi gweld un ffordd i'r gwaith gyda awgrymiadau, sef ein ddatgan amrywiol, ac yna rydym yn ddatgan newidyn arall, pwyntydd amrywiadwy, bod yn cyfeirio at hynny. Felly, rydym wedi creu amrywiol gydag enw, rydym wedi creu ail newidyn gydag enw, ac yr ydym yn tynnu sylw bod ail newidyn bryd hynny gyntaf. Mae'r math hwn o mae gan broblem fodd bynnag, gan ei fod yn yn mynnu ein bod yn gwybod yn union faint o gof rydym yn mynd i angen o bryd mae ein rhaglen yn cael ei llunio. Pam hynny? Oherwydd mae angen inni allu enwi neu nodi pob un o'r newidynnau posibl efallai y byddwn yn dod ar draws. Efallai gennym amrywiaeth a allai fod yn gallu cynnal llawer o wybodaeth, ond mae'n dal i fod yn yn union yn ddigon manwl gywir. Beth os nad ydym yn gwybod, beth os nad oes gennym unrhyw syniad faint y bydd angen i ni ar adeg crynhoi? Neu beth os bydd ein rhaglen rhedeg am amser hir iawn, derbyn amrywiol defnyddiwr data, ac ni allwn mewn gwirionedd amcangyfrif a ydym ni'n mynd i angen 1,000 o unedau? Nid yw'n debyg y gallwn ddweud ar y llinell orchymyn mynd i mewn faint o eitemau ydych yn meddwl y bydd ei angen arnoch. Wel beth os mai dyfalu yn anghywir? Dyrannu cof deinamig fath o yn caniatáu i ni y ffordd i fynd o amgylch broblem benodol hon. A'r ffordd mae'n ei wneud yw drwy ddefnyddio awgrymiadau. Gallwn ddefnyddio awgrymiadau i cael mynediad at ddynamig cof a ddyrannwyd, cof sy'n dyrannu fel eich rhaglen yn rhedeg. Dyw hi ddim yn dyrannu ar adeg crynhoi. Pan fyddwch yn ddynamig yn dyrannu cof mae'n dod o gronfa o gof a elwir yn y domen. Yn flaenorol yr holl cof rydym wedi bod yn gweithio â hwy yn y cwrs wedi bod yn dod o gronfa o gof a elwir yn y pentwr. Ffordd dda o gyffredinol cadw mewn mind-- ac mae hyn yn rheol nid yw bob amser yn dal yn wir, ond 'n bert lawer bron bob amser yn dal true-- yw bod unrhyw tro y byddwch yn rhoi enw newidyn ei yn ôl pob tebyg yn byw ar y corn. Ac unrhyw amser nad ydych yn ei wneud rhoi newidyn enw, y gallwch chi ei wneud gyda'r cof deinamig dyrannu, mae'n byw ar y domen. Nawr rwy'n fath o gyflwyno'r hyn fel os oes y ddau bwll o gof. Ond efallai eich bod wedi gweld hyn diagram, sydd yn gyffredinol cynrychiolaeth o pa cof edrych fel, ac nid ydym yn mynd i ofalu am yr holl y pethau ar y top a'r gwaelod. Yr hyn yr ydym yn gofalu amdano yw y rhan hon mewn y canol yma, tomen a simnai. Fel y gallwch weld gan gan edrych ar y diagram hwn, nad yw'r rhain mewn gwirionedd yn ddau pyllau wahân o gof. Mae'n un pwll a rennir o gof ble fyddwch yn dechrau, yn yr weledol byddwch yn dechrau ar y gwaelod a dechrau llenwi i fyny o'r gwaelod gyda'r simnai, ac yr ydych yn dechrau ar y brig ac yn dechrau llenwi i fyny o'r brig i lawr gyda'r pentwr. Ond y mae mewn gwirionedd y un gronfa, 'i' jyst gwahanol smotiau, gwahanol leoliadau er cof sy'n cael eu dyrannu. A allwch chi rhedeg allan o cof naill ai drwy gael y domen yn mynd yr holl ffordd i'r gwaelod, neu os oes gennych y pentwr fynd yr holl ffordd i ben, neu gael y domen a'r pentwr cwrdd yn erbyn ei gilydd. Gall pob un o'r rheiny fod amodau sy'n achosi eich rhaglen rhedeg allan o gof. Felly cadwch hynny mewn cof. Pan fyddwn yn sôn am y domen a'r pentwr rydym yn wir yn siarad am y un darn cyffredinol o gof, dim ond gwahanol dogn hwnnw cof. Felly sut rydym yn mynd ddeinamig dyrannu cof yn y lle cyntaf? Sut mae ein rhaglen yn cael cof gan ei fod yn rhedeg? Wel C yn rhoi swyddogaeth o'r enw malloc, dyrannydd cof, a oedd yn byddwch yn ffonio i, ac i chi basio mewn faint o bytes o gof a 'ch angen. Felly os yw eich rhaglen yn rhedeg ac rydych am gael Rhedeg cyfanrif, efallai y byddwch yn mallock pedwar bytes o cof, cromfachau malloc pedwar. Bydd mallock mynd drwy edrych drwy'r domen, oherwydd ein bod yn ddynamig dyrannu cof, a bydd yn dychwelyd atoch pwyntydd i'r cof. Nid yw'n rhoi bod memory-- i chi nid yw'n rhoi ei enw, mae'n rhoi pwyntydd iddo chi. Ac felly dyna pam y dywedais eto ei bod yn bwysig efallai wedi gwylio'r fideo awgrymiadau cyn i ni fynd yn rhy bell i mewn i hyn. Felly malloc yn mynd i rhoi chi yn ôl pwyntydd. Os na all mallock roi i chi unrhyw cof am eich bod wedi rhedeg allan, bydd yn rhoi i chi yn ôl pwyntydd nwl. Ydych chi'n cofio beth sy'n digwydd os ydym yn ceisio dereference pwyntydd nwl? Rydym yn dioddef nam SEG, dde? Dyw hynny ddim yn ôl pob tebyg yn dda. Felly, bob tro y byddwch yn gwneud galwad i malloc chi bob amser, bob amser yn Mae angen i wirio a yw'r bwyntydd rhoddodd chi yn ôl yn null. Os ydyw, mae angen i chi i roi terfyn ar eich rhaglen oherwydd os ydych yn ceisio dereference pwyntydd null rydych yn mynd i ddioddef nam segmentu a bod eich rhaglen yn mynd i ddamwain beth bynnag. Felly, sut yr ydym yn llonydd cael yn gyfanrif? int x. Mae'n debyg y byddwn wedi gwneud hynny bagad o weithiau, dde? Mae hyn yn creu newidyn enw x sy'n byw ar y corn. Sut ydym yn ddynamig cael cyfanrif? Px seren Int hafal malloc 4. Neu yn fwy priodol byddem yn dweud px seren int yn hafal i faint malloc o int, dim ond i daflu ychydig llai rhifau hud o gwmpas ein rhaglen. Mae hyn yn mynd i gael i ni pedwar bytes o gof o'r domen, ac mae'r pwyntydd rydym yn cael yn ôl i mae'n cael ei alw'n px. Ac yna yn union fel rydym wedi wneud yn flaenorol rydym yn gall dereference px i gael gafael ar y cof. Sut mae cael cyfanrif gan y defnyddiwr? Gallwn ddweud int x hafal gael int. Dyna 'n bert syml. Beth os ydym am greu amrywiaeth o x fflotiau sy'n byw ar y pentwr? arnofio stack_array-- dyna'r enw o'n cromfachau sgwâr array-- x. Bydd hynny'n creu i ni amrywiaeth o x fflotiau sy'n byw ar y corn. Gallwn greu amrywiaeth o fflotiau sy'n byw ar y domen, hefyd. Efallai y bydd y gystrawen yn edrych yn ychydig yn fwy feichus, ond gallwn ddweud arnofio heap_array seren yn dychwelyd malloc x gwaith maint y fflôt. Mae angen digon o le i mi i ddal x fel y bo'r angen gwerthoedd pwynt. Felly, yn dweud mae angen i mi 100 arnofion, neu 1,000 o fflotiau. Felly, yn yr achos hwnnw byddai'n 400 bytes ar gyfer 100 fflotiau, neu 4,000 bytes ar gyfer 1,000 o fflotiau, oherwydd bod gan bob fflôt yn cymryd i fyny pedwar bytes o ofod. Ar ôl gwneud hyn gallaf ddefnyddio'r cystrawen braced sgwâr ar heap_array. Yn union fel yr wyf y byddai ar stack_array, yr wyf yn yn gallu cael mynediad ei elfennau unigol gan ddefnyddio heap_array sero, un heap_array. Ond dwyn i gof y rheswm y gallwn ni wneud hynny oherwydd bod y enw amrywiaeth yn C mewn gwirionedd yn pwyntydd i elfen gyntaf y casgliad yn. Felly mae'r ffaith ein bod yn datgan amrywiaeth o fflotiau ar y corn yma mewn gwirionedd ychydig yn gamarweiniol. Rydym mewn gwirionedd yn y ail linell o god yno hefyd yn creu pwyntydd i darn o cof yr ydym wedyn yn gwneud rhywfaint o waith gyda. Heres '' r broblem fawr gyda dyrannu cof er ddeinamig, a dyma pam mae'n wirioneddol bwysig i ddatblygu rhai arferion da pan fyddwch yn gweithio gydag ef. Yn wahanol i ddatgan llonydd cof, eich cof Nid ei ddychwelyd yn awtomatig i'r system pan fydd eich swyddogaeth yn cael ei wneud. Felly, os oes gennym brif, ac prif galw swyddogaeth f, pan f gorffeniadau beth bynnag mae'n ei wneud ac yn dychwelyd rheolaeth y rhaglen yn ôl i'r brif, pob un o'r cof bod f a ddefnyddir yn cael ei roi yn ôl. Gellir ei ddefnyddio eto gan rai rhaglenni eraill, neu ryw swyddogaeth arall sydd yn cael ei alw yn ddiweddarach yn brif. Gall ddefnyddio yr un cof ar ôl tro. Os ydych yn ddynamig dyrannu cof er rhaid i chi ddweud yn benodol y system sy'n rydych yn ei wneud ag ef. Bydd yn dal eu gafael ar hynny ar eich rhan, a allai yn arwain at broblem yr ydych yn rhedeg allan o gof. Ac yn wir yr ydym weithiau yn cyfeirio at hyn fel yn gollwng cof. Ac weithiau gollwng cof hyn Gall mewn gwirionedd fod yn wirioneddol ddinistriol ar gyfer perfformiad system. Os ydych yn ddefnyddiwr y rhyngrwyd yn aml Efallai y byddwch yn defnyddio rhai porwyr gwe, ac nid wyf am enwi enwau yma, ond mae rhai porwyr gwe allan yna sydd yn enwog am gael mewn gwirionedd ollyngiadau cof nad ydynt yn cael eu gosod. Ac os byddwch yn gadael eich porwr agored am gyfnod hir iawn o amser, dyddiau a diwrnod, neu wythnosau, byddwch weithiau Efallai sylwi bod eich system yn rhedeg yn iawn, iawn yn araf. A'r rheswm am hynny yw bod mae'r porwr wedi dyrannu cof, ond yna nid wrth y system ei fod yn ei wneud ag ef. Ac felly mae hynny'n gadael llai o gof ar gael ar gyfer eich holl raglenni eraill i gael i rannu, oherwydd eich bod yn leaking-- y porwr gwe rhaglen yn gollwng cof. Sut ydym yn rhoi gof yn ôl pan fyddwn ni'n ei wneud ag ef? Wel yn ffodus ei fod yn ffordd hawdd iawn i wneud hynny. Rydym yn unig rhyddhau ei. Mae 'na swyddogaeth a elwir yn rhad ac am ddim, mae'n derbyn pwyntydd i gof, ac rydym yn dda i fynd. Felly, gadewch i ni ddweud ein bod yn y nghanol ein rhaglen, rydym am malloc 50 cymeriadau. Rydym am malloc amrywiaeth y gall gallu dal 50 o gymeriadau. A phan fyddwn yn cael pwyntydd yn ôl i hynny, enw sy'n pwyntydd yn air. Rydym yn gwneud beth bynnag rydym yn mynd i'w wneud gyda'r geiriau, ac yna pan fyddwn ni'n wneud rydym yn unig am ddim iddo. Ac yn awr rydym wedi dychwelyd 50 y rhai bytes o gof yn ôl i'r system. Gall rhai swyddogaeth arall yn eu defnyddio. Nid oes rhaid i chi boeni am dioddef gollwng cof am ein bod wedi rhyddhau gair. Rydyn ni wedi cael y cof yn ôl, felly rydym chi wedi gorffen gweithio ag ef. Felly mae tri rheolau aur y dylai cael eu cadw mewn cof pryd bynnag y byddwch chi'n dyrannu cof ddeinamig gyda malloc. Mae pob bloc o cof bod byddwch malloc rhaid eu rhyddhau cyn eich rhaglen yn gorffen rhedeg. Yn awr eto, yn y peiriant neu yn y IDE hwn yn fath o yn digwydd i chi beth bynnag pan you-- bydd hyn yn digwydd beth bynnag pan fydd eich rhaglen yn cael ei derfynu, bydd yr holl y cof yn cael ei ryddhau. Ond mae'n codio gyffredinol dda ymarfer i bob amser, pan fyddwch chi'n ei wneud, rhad ac am ddim yr hyn yr ydych wedi mallocd. Wedi dweud hynny, dim ond pethau sy'n eich bod wedi Dylid mallocd gael ei ryddhau. Os byddwch yn datgan llonydd yn cyfanrif, int x hanner colon, sy'n byw ar y simnai, yr ydych Nid oes yna eisiau x am ddim. Felly dim ond y pethau yr ydych wedi Dylai mallocd gael ei ryddhau. Ac yn olaf, nid gwneud rhywbeth am ddim ddwywaith. Gall hynny arwain at sefyllfa rhyfedd arall. Felly popeth yr ydych wedi mallocd wedi i gael ei ryddhau. Dim ond y pethau yr ydych wedi Dylid malloc gael ei ryddhau. Ac nid gwneud rhywbeth am ddim ddwywaith. Felly gadewch i ni fynd drwy esiampl yma o'r hyn y mae rhai ddyrannwyd ddeinamig Efallai y cof yn edrych fel cymysg mewn gyda rhai cof statig. Beth allai ddigwydd yma? Gwelwch os gallwch ddilyn ar hyd a dyfalu beth sydd mynd i ddigwydd wrth i ni fynd trwy'r holl y llinellau hyn o god. Felly, rydym yn dweud int m. Beth sy'n digwydd yma? Wel mae hyn yn eithaf syml. Yr wyf yn creu newidyn cyfanrif a elwir m. Rwyf liw gwyrdd, oherwydd dyna y lliw fy mod yn ei ddefnyddio pan dwi'n siarad am newidynnau cyfanrif. Mae'n blwch. Mae'n cael ei alw m, ac rydych yn gallu gyfanrifau storio tu mewn iddo. Beth os byddaf wedyn yn dweud seren int a? Wel mae hynny'n eithaf tebyg. Im 'yn creu bocs o'r enw. Mae'n gallu int daliad sêr, awgrymiadau i gyfanrifau. Felly rwy'n liwio yn wyrdd-ish hefyd. Yr wyf yn gwybod ei fod wedi rywbeth i'w wneud gyda cyfanrif, ond nid ei hun ei fod yn gyfanrif. Ond mae'n 'n bert lawer yr un syniad. Rydw i wedi creu bocs. Mae'r ddau o'r rhain hawl yn awr yn byw ar y corn. Rydw i wedi rhoi y ddau enw iddynt. seren int b yn cyfateb maint malloc o int. Gallai hyn un fod ychydig yn anodd. Cymerwch eiliad ac yn meddwl am yr hyn yr ydych Byddai disgwyl i ddigwydd ar y diagram hwn. seren int b yn cyfateb maint malloc o int. Wel nid yw hyn yn unig yn creu un blwch. Mae hyn mewn gwirionedd yn creu dau flwch. Ac mae'n clymu, mae hefyd yn sefydlu pwynt mewn perthynas. Rydym wedi dyrannu un bloc o gof ar y domen. Sylwch fod y blwch uchaf ar y dde yna nid oes gan enw. Rydym yn mallocd ef. Mae'n bodoli ar y domen. Ond b Mae gan enw. Mae'n newidyn pwyntydd o'r enw b. Sy'n byw ar y pentwr. Felly mae'n ddarn o gof sy'n cyfeirio at un arall. b yn cynnwys y cyfeiriad y bloc o cof. Nid oes ganddo enw fel arall. Ond mae'n cyfeirio ato. Felly, pan ddywedwn seren int b hafal maint malloc o int, yr hawl honno yno, y saeth a popped i fyny ar y ochr dde yno, bod holl beth, Bydd rhaid i mi iddo ymddangos eto, yw beth sy'n digwydd. Mae hynny i gyd yn digwydd mewn y llinell o god. Nawr byddwn yn cael ychydig yn fwy syml eto. yn hafal ampersand m. Ydych chi'n cofio beth yw yn hafal i ampersand m yw? Wel dyna yn cael cyfeiriad m yn. Neu rhoi mwy diagram, pwyntiau i m. yn hafal b. Iawn felly dyma un arall. A hafal b. Beth sy'n mynd i ddigwydd at y diagram y tro hwn? Wel cofio bod y gwaith gweithredwr aseiniad drwy aseinio gwerth ar y hawl i werth ar y chwith. Felly, yn lle pwyntio at m, yn awr yn cyfeirio at yr un lle y b bwyntiau. nid yw ddim yn pwyntio ib, a pwyntiau lle b bwyntiau. Os yw pigfain ib y byddai wedi bod yn hafal ampersand b. Ond yn hytrach yn dychwelyd b unig yn golygu bod a a b yn awr gan dynnu sylw at yr un cyfeiriad, gan fod tu mewn b yn unig yw gyfeiriad. Ac yn awr y tu mewn o yn yr un cyfeiriad. m hafal 10, yn ôl pob tebyg y y rhan fwyaf o beth syml rydym wedi ei wneud mewn ychydig bach. Rhowch y 10 yn y blwch. Star b hafal m ynghyd â 2, dwyn i gof o ein pa seren awgrymiadau fideo b olygu. Rydym yn mynd i dereference b a'i roi rhywfaint o werth yn y lleoliad hwnnw cof. Yn yr achos hwn 12. Felly, pan fyddwn yn dereference pwynt o galw i gof rydym yn unig yn teithio i lawr y saeth. Neu mewn geiriau eraill, yr ydym yn mynd i'r cyfeiriad hwnnw cof ac yr ydym yn trin mewn rhyw ffordd. Rydym yn rhoi rhywfaint o werth mewn 'na. Yn yr achos hwn seren b yn hafal i m a 2 yn unig mynd i'r newidyn tynnu sylw atynt gan b, mynd i'r cof yn tynnu sylw at y b, ac yn rhoi m ynghyd â 2 mewn 'na, 12. Nawr rwy'n rhyddhau b. Beth fydd yn digwydd pan fyddaf yn rhad ac am ddim b? Cofiwch yr hyn a ddywedais yn golygu rhad ac am ddim. Beth ydw i'n ei ddweud pan fyddaf yn rhad ac am ddim b? Dwi'n ei wneud yn gweithio ag ef, dde? Yr wyf yn y bôn rhoi'r gorau i'r cof. Wyf yn ei roi yn ôl i'r system. Nid oes angen hyn anymore myfi yr hyn rwy'n dweud wrthyn nhw, OK? Nawr, os wyf yn dweud seren a yn hafal i 11 mae'n debyg y gallwch eisoes yn dweud bod rhywbeth drwg yn mynd i ddigwydd yma, dde? Ac yn wir os wyf yn ceisio fy mod yn ôl pob tebyg Byddai dioddef nam segmentu. Oherwydd erbyn hyn, er bod yn flaenorol darn sydd o gof yn rhywbeth y bu'n rhaid i mi mynediad at, yn y fan hon erbyn hyn rwy'n cael mynediad cof bod Nid yn gyfreithlon i mi i gael mynediad. Ac fel y byddwn yn ôl pob tebyg galw i gof, pan fyddwn yn cael mynediad cof nad ydym yn fod i gyffwrdd, dyna yr achos mwyaf cyffredin o segmentiad fai. Ac felly mae fy rhaglen Byddai damwain os wyf yn ceisio gwneud hyn. Felly unwaith eto mae'n syniad da cael dda arfer ac yn dda arferion rhan annatod wrth weithio gyda malloc ac am ddim, fel na fyddwch yn dioddef segmentu namau chi, ac yn eu defnyddio eich ddyrannu ddeinamig cof yn gyfrifol. Rwy'n Doug Lloyd mae hyn yn CS50.