[Musika jotzen] DOUG LLOYD: OK beraz iradokizun bat Hemen hasi aurretik. Ez duzu bideoa ikusi ditut bada Erakusleak, beraz, lehen egin nahi duzu. Bideo honetan dagoelako beste erakusleak lan egiteko modua. Beraz, hitz egin zenbait kontzeptu buruz estaltzeko garela batean Bideo erakusleak, eta ez gara Horien gainetik distira orain, Dagoeneko Oraindik dutela suposatuz Sort ulertu. Beraz, zure arrazoizko abisua besterik ez da duzula bideo hau ikusten ari bazara eta ez duzu ikusi du erakusleak bideo, baliteke Sort buru gainetik hegan pixka bat. Eta beraz, hobe daiteke behatu ordena horretan. Beraz, ikusi dugu dagoeneko inork Bide erakusle batekin lan, hau da, bat aldarrikatzen dugu aldakorra, eta gero guk beste aldagai bat deklaratzen, erakuslea aldakorra, dela seinalatzen. Beraz, sortu dugu bat izen batekin aldakorra, dugu bigarren aldagai bat sortu izen batekin, eta azpimarratu dugu bigarren aldagai hori Lehenengo hartan. Honen moduko bat dauka Arazoa ordea, delako zehazki jakin behar ditugu zenbat memoria gaude Oraingoz behar joan Gure programa konpilatu. Zergatik da hori? Izendatzeko gai izan behar dugulako edo aldagai posibleen guztiak identifikatzeko agian topo egingo dugu. Baliteke egongo den array bat daukagu informazio asko eduki ahal, baina ez da oraindik zehazki nahikoa zehatza. Zer ez badugu, zer ideia ez badugu zenbat biltzeko ordua bilatuko dugu behar? Edo zer gure programa hala nahi izanez gero benetan luze iraungo du, Erabiltzaile hainbat onartuz datuak, eta ezin dugu benetan balioesteko ari garen ala ez 1.000 unitate behar du? Ez da ahal dugun lerroan esaten Sar elementuak zenbat Uste duzu behar duzu. Beno zer asmatzen oker dago bada? Memoria esleipena dinamiko Sort ematen digu modu den arazo jakin honen inguruan. Eta bidea egiten da erakusleak erabiliz. Erakusleak erabili ahal izango dugu sarrera lortzeko dinamikoki esleitu memoria, memoria hori da Zure programa egozten martxan dago. Ez Konpilatzerakoan esleitu. When dinamikoki esleitu memoria dator putzu bat da memoria-meta bezala ezagutzen. Aurretik memoria guztia dugu aritu da ikastaroa batera izan igerileku bat datozen memoria pila bezala ezagutzen. A modu ona da, oro har, mind-- eta honek arau mantendu Ez du beti eutsi egia, baina nahiko askoz ia beti dauka true-- da edozein dela denbora aldagai izen bat ematen dizute seguruenik, pila bizi da. Eta edozein ez duzu aldagai bat, izen bat eman, bertan memoria dinamiko batekin egin dezakezu esleipena, bizi zeure gainean da. Orain Mota naiz hau aurkezteko bi memoria igerileku horiek ez bada. Baina ikusi ahal izango duzu hau diagram, hau da, oro har, ordezkaritza bat zer memoria itxura du, eta ez gara guztiak kezkatzen joan goiko eta beheko aldean dagoen gauza. Zer buruz zaintzen dugu zati hau erditik, hemen, arazoak izaten ari da eta pila. Ikusi ahal izango den bezala diagrama honetan begira, horiek benetan ez dira bi memoria igerilekuak bereiziak. Da memoria putzu shared bat egiten Bertan, hasten zara bisuala honetan hasteko, behealdean eta martxan betez pila batera hondoan, eta zuk goialdean hasi eta martxan betez goitik behera zeure from. Baina benetan da igerileku berean, besterik ez da lekuak ezberdinak, leku desberdinetan memoria hori esleituko ari dira. Atera eta zuk exekutatu daiteke bai edukitzea memoria zeure modu guztiak joan beheraino, edo dute pilaren modu guztiak joan, goiko aldean, edo zeure eta pila izatea elkartu bata bestearen aurka. Horiek guztiek baldintza izan daiteke Hori da zure programa sor den memoria agortu. Beraz, kontuan izan hori. When buruz hitz egiten dugu zeure eta pila dugu benetan hitz egiten ari bera memoria zatia general, besterik Memoria horren zati desberdinek. Beraz, nola ez dinamikoki lortuko dugu memoria esleitu lehenik eta behin? Nola lortu du gure programa memoria, exekutatzen ari den bezala? Beno C izeneko funtzio bat ematen malloc, memoria allocator, bertan dei bat egin nahi duzun, eta pasatzen duzu zenbat memoria byte nahi duzun. Beraz, zure programa martxan badago eta zenbaki oso exekuzio bat nahi duzu, lau byte mallock dezakezun memoria, malloc parentesi lau. mallock joango bidez zeure bidez bila, dinamikoki garelako memoria esleitzean, eta izango duzu itzuliko da memoria hori erakuslea. Ez du ematen dizute memoria gordetzeko duten ez du eman izena, duzu, erakuslea bat ematen dio. Eta beraz, horregatik esan dut berriro garrantzitsua da, agian, erakusleak bideoa ikusi ditut Urrunegi lortuko dugu aurretik honetan sartu. Beraz malloc Honez joan ematen duzu atzera erakuslea. Mallock ezin bada eman duzu edozein you korrika dut delako memoria, Emango dizu egingo back null erakuslea. Gogoratzen al dugu bada, zer gertatzen saiatu eta null erakuslea dereference? Seg matxura bat jasaten dugu, ezta? Hori da, ziurrenik, ez da ona. Beraz, aldi bakoitzean dei bat egiten duzunean you malloc beti, beti egiaztatu behar diren ala ez erakuslea eman zion itzuli da zuk nulua. Bada, zure programa amaitu behar duzu saiatu baduzu eta dereference delako null erakuslea bazoazela segmentazio matxura bat pairatu behar eta zure programa da hala ere huts joan. Beraz, nola egiten dugu estatikoki zenbaki oso bat lortzeko? int x. Seguru asko dugu hori egin aldiz mordo bat, ezta? Hau izeneko aldagai bat sortzen du pila bizi da x. Zelan dinamikoki lortu dugu zenbaki oso bat? Int izar px malloc 4 berdin. Edo gehiago modu egokian int izar px esan genuen int tamaina malloc berdin, besterik batzuk gutxiago botatzen magia zenbakiak gure programa inguruan. Hau da guretzat lortzeko joan lau memoria byte zeure hasita, eta erakuslea lortuko dugu atzera px deritzo. Eta gero dugu bezalaxe Aurretik egin dugu Ahal px dereference memoria hori eskuratu. Zelan erabiltzaileari zenbaki bat lortuko dugu? Esan int x berdinen lortu int izango dugu. Hori nahiko erraza. Zer array bat sortu nahi badugu x pila gainean bizi diren karroza? flotatzen stack_array-- duen izena da gure array karratu parentesi x. Hori izango da gurekin array bat sortzea x pila gainean bizi diren karroza. Karroza array bat sortu ahal izango dugu Hori zeure gainean bizi da, gehiegi. Sintaxia bat begiratu dezake gutxi gehiago astuna, baina karroza esan dezakegu Izar heap_array berdinen malloc x aldiz karroza tamaina. Gela nahikoa behar dut eutsi x koma mugikorreko balio. Beraz, esan behar dut 100 karroza, edo 1.000 karroza. Beraz, kasu horretan izango litzateke 400 byte 100 karroza, edo 4.000 byte 1.000 karroza, karroza bakoitzak hartzen delako lau espazio byte. Hau egin ondoren erabili ahal izango dut kortxetea heap_array sintaxia. Besterik ez litzateke stack_array on dudan bezala, I bere elementuak banaka sartu ahal izango da heap_array erabiliz zero, bat heap_array. Baina gogoratzen arrazoia egin ahal izango dugu, delako C array baten izena benetan erakuslea Array horretan lehenengo elementua. Izan ere, ez dugula bat deklaratzen ari karroza sorta pila hemen benetan pixka bat engainagarria. Benetan ere gaude kodea bigarren dago halaber erakuslea sortzeko pusketa bat memoria hori, gero lan batzuk egin ditugu. Hona hemen arazo handi du dinamikoki memoria esleitu arren, eta hau da, zergatik da benetan Garrantzitsua ohitura onak batzuk garatzeko denean berarekin lanean ari. Estatikoki deklaratu bezala memoria, zure memoria ez da automatikoki itzuli sistema denean zure funtzioa egiten da. Beraz nagusia dugu, eta bada funtzio nagusia deitzen f, f akaberak egiten ari denean dena delakoa eta programaren kontrola itzultzen memoriaren nagusia, atzera guztiak f Erabiltzen atzera ematen da. Berriro erabili ahal izateko beste programa batzuek, edo beste funtzio batzuk lortzen geroago izeneko nagusian. Memoria hori bera gehiagoko berriz erabili ahal izango da. Baduzu dinamikoki esleitu memoria arren Esplizituki esango duzu Berarekin duzula Bukatutakoan sistema. Aldera egingo da mantendu behar da, eta horrek Could Arazo bat ekarriko agortzen duzu oroimenaren. Eta hain zuzen ere, batzuetan, erreferentzia dugu honetarako memoria leak gisa. Eta memoria filtrazioen horien batzuetan benetan izan daiteke benetan suntsitzaileak sistema jokabideagatik. Internetera erabiltzaile maiz uzten badu Web nabigatzaile zenbait erabil dezakezu, eta ez dut izendatzeko izen hemen, baina Web nabigatzaile batzuk daude hor kanpoan hori benetan izatea nabaria memoria filtrazioak ez get finkoa. Eta zure nabigatzailean irekita uzten baduzu denbora oso luzez, egun eta egun, edo aste, batzuetan baliteke zure sistema hori nabarituko benetan korrika, benetan poliki da. Eta horren arrazoia dela nabigatzailea memoria esleitu ditu, baina orduan ez sistemako esan Dela kito. Eta beraz, memoria gutxiago uzten Zure beste programa guztiak eskuragarri partekatzeko dute, Oraindik delako leaking-- web nabigatzaileak programaren memoria leaking. Zelan memoria emango dugu atzera Bukatutakoan dugu? Beno zorionez da egiteko modu oso erraza. Besterik askatzea dela da. Badira free izeneko funtzio bat da, erakuslea onartu egiten oroimenerako, eta onak joan gara. Hargatik esaten ari ginen batean Gure programa erdian, 50 karaktere malloc nahi dugu. Ahal matrize malloc nahi dugu 50 karaktere eskuratzeko gai. Eta noiz erakuslea lortuko dugu atzera hori, erakuslea izenaren hitza da. Ez dugu edozein dela ere gaude den hitzarekin lotutako joan, eta orduan, ez gara Egin askatu besterik ez dugu. Eta orain itzuli egin ditugun 50 horiek memoria byte sistema atzera. Beste funtzio batzuk erabili dezakegu. Guk ez dugu izan nahi bat jasaten kezkatu memoria leak hitza libratuko dugu delako. Memorian atzera eman ditugu, beraz ari gara egiten da lan egitea. Beraz, badira hiru urrezko arauak hori behar duten Kontuan izan bedi direnean Oraindik dinamikoki memoria esleitzean malloc. Memoria bloke bakoitza malloc libratuko behar duzu Zure programa aurretik korrika bukatuz. Orain, berriz ere, aparatuaren edo hasi IDE hau moduko zuretzat gertatzen dena den denean zu hau hala gertatuko da Programa amaitzean, memorian guztiak kaleratu egingo. Baina kodetze oro har, ona da beti praktikan, amaitu duzunean, zer mallocd duzu libratzeko. Esan, gauza bakarra dagoela duzun libratuko behar mallocd. You estatikoki deklaratzeko bat izanez gero, osokoa, int x puntu, pila bizi da, zuk Ez gero x askatu nahi. Zaituzte duten gauza bakarra, beraz, mallocd libre utziko luke. Eta, azkenik, egiten ez den zerbait doan birritan. Hori ekar dezake beste egoera bitxi. Beraz, dena zuk amesten mallocd libre utziko ditu. Zaituzte duten gauza bakarra malloc libre utziko luke. Eta ez zerbait doan birritan. Beraz, goazen adibide baten bidez hemen zer batzuk dinamikoki esleitu of memoria mistoa agian itxura memoria estatiko batzuk ere. Hemen zer gerta liteke? Ikusi jarraitu ahal bada batera eta asmatzen zer da goazela gertatuko Kode lerro hauen guztien bidez. Beraz, int m esaten dugu. Zer gertatzen da hemen? Beno, hau da, nahiko erraza. M izeneko Osoko aldagai bat sortu dut. Margotu dut berdea, kolorea delako hitz egiten ari naiz erabiltzen dudala zenbaki oso aldagai buruz. Kutxa bat da. Honez m deitzen, eta ahal duzun horren barruan zenbaki osoko denda. Zer dut eta gero esan int izar bat balitz? Beno, nahiko antzekoa da. Sortzen ari naiz izeneko koadro bat. Da holding int gai izarrak, osokoak erakusle. Beraz margotu dut berde-ish baita. Zerbait ditu ezagutzen dut zenbaki oso bat egin, baina ez bera da zenbaki osoa. Baina nahiko askoz ideia bera da. Kutxa bat sortu dut. Eskubidea horiek biak orain pila bizi. Eman dut horietako bi izenak. int izar b berdinen int tamaina malloc. Honek apur bat zaila izan liteke. Hartu segundo bat eta zer duzu pentsatu diagrama hau gertatuko espero. int izar b berdinen int tamaina malloc. Beno, honek ez du besterik sortu kutxa bat. Hau benetan bi kaxa sortzen. Eta lotzen ditu, ezartzen du, gainera, Harreman batean puntu bat. Bloke bat esleitu dugu memoria zeure gainean. Iragarki goiko eskuineko koadroan dagoela Han ez du izenik. Egiten mallocd dugu. Zeure gainean existitzen da. Baina b izen bat dauka. B erakuslea izeneko aldagai bat da. Pila bizi da. Beraz, memoria zati bat da hori beste bat darama. b helbidea dauka memoria bloke horren. Ez du izen bat izan bestela. Baina puntu bezala agertzen da. Beraz, esan dugun int izar b berdinen malloc int tamaina, eskubidea ez dagoela, gezi hori idatz sortu du: Eskuinaldean dago, oro har, gauza hori, Izan dut da agertzen berriro, da zer gertatzen den. Hori guztia gertatzen da kode lerro bakar horretan. Orain gutxi gehiago lortuko dugu erraza berriro. a ampersand m berdin. Ez zer gogoratzen duzu berdinen ampersand m da? Beno, hori da bat m en helbide lortzen. Edo jarri gehiago diagrammatically, m puntu bat. a berdinen b. Ados, beraz, hemen beste bat da. A berdinen b. Zer gertatuko Diagraman denbora hau? Beno, gogora ekarri du duela esleitzeko operadorea lanak balioa esleitu eskuinetik ezkerrera on balioa. Beraz ordez m seinalatuz a, orain bat b puntuak leku berean darama. batek ez b puntura, a non b puntuak seinalatzen. B adierazi bat izanez gero, izan dira bat ampersand b berdin. Baina horren ordez berdin besterik b esan nahi du, eta b orain helbide bera seinalatzen duelako b barrutik besterik helbidea da. Eta orain, bat-barrutik helbide bera da. m berdinen 10, ziurrenik zuzenean gauzarik Pixka bat ere egin dugu. Jarri 10eko koadroan. Star b berdinen m plus 2, gogoratzen gure erakusle bideo zer izar b esan nahi du. Ari gara dereference b eta jarri nahi dut Memoriaren balio batzuk. Kasu honetan 12 urtean. Beraz, noiz dugun puntu bat erreferentzia kenduta Gogoratzen bidaiatzeko besterik behera dugu gezi. Edo bestela esanda, ez dugu memoria helbide horretara joan eta manipulatu dugu nolabait. Balio batzuk jarri ditugu han. Kasu honetan izar b m berdinen plus 2 besterik ez da aldakorreko joateko adierazi by b, memoria joateko adierazi by b, eta jarri m plus 2 han ere, 12. Orain b askatu nuen. Zer gertatzen da I denean b askatzea? Gogoratu zer esan free esan nuen. Zer ari naiz I denean b askatzea esaten? Naiz egiten da lan egitea, ezta? Funtsean uzten ditut memorian. Ematen dut back sistema. Ez dut behar hau jada zer horiek kontatzen dut, OK? Orain esan badut izar bat berdinen 11 seguruenik dezakezu Dagoeneko zerbait txarra dela esango hemen gertatuko da, ezta va? Eta seguruenik dut saiatu naiz, egia baldin bada segmentazio errua jasango luke. Orain delako, nahiz eta Aurretik zatia memoria hori zerbait zela izan nuen sartzeko, puntu honetan orain memoria dut sartzean duten Ez da lege for me to sartzeko. Eta seguruenik izango dugu Gogoratzen denean, memoria sartzeko dugu ari garela, ez ustezko ukitu, hori kausa ohikoena da segmentazio bat hutsegite. Eta orain nire programa kraska litzateke hau egin nahi izan banu. Beraz, berriro ere, ideia ona da ona lortu da praktika onak eta ohiturak errotuta malloc eta doan lan egiten denean, beraz, ez duzula segmentazio sufritzen matxurak erabili, eta zuk Zure dinamikoki esleitu memoria arduraz. Naiz Doug Lloyd hau CS50 da.