[TÓNLIST spila] DOUG LLOYD: OK svo tillaga áður en hér. Ef þú hefur ekki horft á vídeó á ábendingum sem þú might vilja til að gera það fyrst. Vegna þess að þetta vídeó er annað leið til að vinna með ábendingum. Svo það er að fara að tala um nokkur hugtök sem við ná í ábendingum vídeó, og við erum fara að gljái yfir þeim núna, að því gefnu að þeir eru nú þegar konar skilið. Svo er það bara sanngjörn viðvörun þitt að ef þú ert að sjá þetta vídeó og þú hefur ekki séð ábendingum video, það gæti konar fljúga yfir höfuðið svolítið. Og svo það gæti verið betra að horfa á það í þessari röð. Þannig að við höfum þegar séð einn leið til að vinna með ábendingum, sem er við lýsa yfir breyta, og þá erum við lýsa annað breytu, bendi breyta, sem bendir til þess. Þannig að við höfum skapað breyta með nafni, höfum við skapað annað breytu með nafni, og við benda á að annar breyta á sem fyrst. Þessi tegund af hefur vandamál þó, vegna þess að það þarf okkur að vita nákvæmlega hversu mikið minni við erum að fara að þurfa augnablik áætlun okkar er unnin. Afhverju er það? Þar sem við þurfum að vera fær um að nafn eða finna allar mögulegar breytur við gætum fundur. Við gætum hafa fjölbreytta sem gæti verið fær um að halda mikið af upplýsingum, en það er samt ekki nákvæmlega nógu nákvæmt. Hvað ef við vitum ekki, hvað ef við höfum ekki hugmynd hversu mikið við munum þurfa á saman tíma? Eða hvað ef áætlun okkar mun hlaupa fyrir mjög langan tíma, samþykkja ýmsar notanda gögn, og við getum í raun ekki meta hvort við erum að fara að þurfa 1.000 einingar? Það er ekki eins og við getum segja á the stjórn lína inn hvernig mörg atriði þú heldur að þú þarft. Jæja hvað ef það víst er rangt? Dynamic minni úthlutun konar gerir okkur hvernig að komast í kringum þetta tiltekna vandamál. Og hvernig það gerir það er með því að nota ábendingum. Við getum notað ábendingum til fá aðgang að virk úthlutað minni, minni sem er úthlutað sem forritinu er í gangi. Það er ekki úthlutað á saman tíma. Þegar þú úthluta virk minni það kemur úr laug minni þekktur sem hrúga. Áður allir minni að við höfum verið að vinna með í námskeiðinu hefur verið að koma úr laug af minni þekktur sem stafla. Góð leið til að almennt halda í mind-- og þessari reglu ekki alltaf að halda rétt, en ansi mikið nær alltaf heldur true-- er að allir skipti sem þú gefur breyta nafni það líklega býr á mánudaginn. Og hvenær þú ert ekki gefa breytu nafni, sem þú getur gert með dynamic minni úthlutun, býr það á hrúga. Nú er ég svona að kynna þetta sem ef það er að þessir tveir laugar minni. En þú gætir hafa séð þetta skýringarmynd, sem er yfirleitt framsetning hvaða minni lítur út, og við erum ekki að fara að hugsa um allt draslið efst og neðst. Það sem við hugsa um er þetta hluti í miðju hér hrúga og stafla. Eins og þú getur séð með horfa á þetta línurit, þetta í raun eru ekki tveir aðskilin söfn minni. Það er einn hluti laug minni þar sem þú byrjar, í þetta sjón þú byrjar neðst og byrja að fylla upp frá botni með stafla, og þú byrja efst og byrja að fylla upp frá toppi niður með hrúga. En það er í raun Sama pool, það er bara mismunandi staði, mismunandi stöðum í minni sem eru úthlutað. Og þú getur keyrt út af minni með því að annaðhvort hafa hrúga fara alla leið til botns, eða hafa stafla fara alla leið á toppinn, eða hafa hrúga og stafla mæta upp á móti hver öðrum. Allir sem geta verið skilyrði sem valda program að keyra út af minni. Svo halda að í huga. Þegar við tölum um hrúga og stafla við erum í raun að tala um sömu almennu klumpur af minni, bara mismunandi hlutar þess minni. Svo hvernig eigum við að fá breytilega úthlutað minni í fyrsta sæti? Hvernig virkar program okkar fá minni eins og það er í gangi? Jæja C veitir fall sem kallast malloc, minni allocator, sem þú hringir í og ​​þú fara í hversu margir bæti af minni sem þú vilt. Þannig að ef kerfið er í gangi og þú vilt heiltala afturkreistingur, þú gætir mallock fjögur bæti minni, malloc sviga fjórir. mallock mun fara í gegnum leita í gegnum the hrúga, vegna þess að við erum virk úthlutun minni, og það mun koma aftur til þín bendi til þess minni. Það þýðir ekki að gefa þér að memory-- það þýðir ekki að gefa það a nafn, það gefur þér bendi til þess. Og svo er það þess vegna aftur og ég sagði að það er mikilvægt að kannski hefur fylgst með ábendingum vídeó áður en við komum of langt inn í þetta. Svo malloc er að fara að gefa þér aftur bendi. Ef mallock get ekki gefið þér eitthvað minni vegna þess að þú hefur keyrt út, það mun gefa þér aftur núll músina. Manstu hvað gerist ef við reyna dereference núll músina? Við þjást seg kenna, ekki satt? Það er líklega ekki gott. Svo í hvert skipti sem þú hringir að malloc þér alltaf, alltaf þarf að athuga hvort ekki bendillinn það gaf þér er aftur null. Ef það er, þú þarft að ljúka program vegna þess að ef þú reynir og dereference null bendillinn þú ert að fara að þjást skiptingu kenna og program er að fara að hrun engu að síður. Svo hvernig gera við statically fá heiltölu? int x. Við höfum líklega gert það fullt af tímum, ekki satt? Þetta skapar breytu sem heitir x sem býr á mánudaginn. Hvernig eigum við að fá breytilega heiltala? Int stjörnu px jafngildir malloc 4. Eða meira viðeigandi við myndum segja INT stjörnu PX jafngildir malloc stærð int, bara að kasta sumir færri galdur númer kringum prógramminu. Þetta er að fara að fá okkur fjögur bæti af minni frá hrúga, og bendillinn við fáum aftur í það er kallað px. Og þá bara eins og við höfum gert áður við getur dereference px til aðgang að minni. Hvernig eigum við að fá heila tölu frá notanda? Við getum sagt int x jafngildir fá int. Það er frekar einfalt. Hvað ef við viljum búa til array af x fljóta sem búa á mánudaginn? fljóta stack_array-- það er nafn af array-- hornklofa okkar x. Það mun skapa fyrir okkur array af x fljóta sem búa á mánudaginn. Við getum búið til fjölda fljóta sem býr á hrúga, of. The setningafræði gæti litið lítið meira fyrirferðarmikill, en við getum sagt fljóta stjörnu heap_array jafngildir malloc x sinnum the stærð af the fljóta. Ég þarf nóg pláss til að halda x fleytitölum. Svo segi ég þarf 100 fljóta, eða 1.000 flýtur. Svo í því tilfelli að það væri 400 bytes fyrir 100 fljóta, eða 4.000 bytes fyrir 1000 fljóta, því að hver fljóta tekur fjögur bæti af plássi. Eftir að gera þetta sem ég get notað hornklofi setningafræði á heap_array. Bara eins og ég vildi á stack_array, ég geta nálgast þætti sínum fyrir sig með heap_array núll, heap_array einn. En muna ástæðu sem við getum gert það er vegna þess að nafn fylki í C er í raun bendi Fyrsti þátturinn því fylki er. Svo fyrir þá staðreynd að við erum að lýsa yfir array af fljóta á mánudaginn hér er í raun dálítið villandi. Við erum í raun í annarri línu af kóða þar einnig að skapa bendi klumpur af minni að við gerum þá sumir vinna með. Hér er stórt vandamál með virk úthlutað minni þó, og þetta er hvers vegna það er mjög mikilvægt að þróa sumir góða siði þegar þú ert að vinna með það. Ólíkt statically lýst minni, minni þitt er ekki sjálfkrafa aftur til kerfi þegar virka er gert. Svo ef við höfum helstu, og Helstu kallar virka f Þegar F lýkur hvað það er að gera og skilar stjórn áætlunarinnar Til baka á aðalsíðu, allt minni að f notað er gefið til baka. Það er hægt að nota aftur með annað forrit, eða einhver önnur aðgerð sem fær kallað síðar í aðal. Það er hægt að nota þessi sömu minni aftur. Ef þú virk úthluta minni þó þú þarft að sérstaklega segja að kerfi sem þú ert búinn með það. Það verður að halda á það fyrir þig, sem gæti leiða til vandamál af að keyra út af minni. Og í raun við er átt stundum að þetta sem minni leka. Og stundum þessar minni lekur geta í raun verið mjög hrikalegt fyrir frammistöðu kerfisins. Ef þú ert a tíður internet notandi þú gætir notað ákveðin vöfrum, og ég mun ekki nefna nöfn hér, en það eru sumir vafrar þarna úti sem eru alræmd fyrir að hafa raunverulega minni lekur sem fæ ekki fastur. Og ef þú skilur vafrinn þinn opinn fyrir mjög langan tíma, daga og daga, eða vikur, þú stundum kannski eftir því að kerfið þitt er í gangi í raun, raunverulega hægt. Og ástæðan fyrir því er sú að vafrinn hefur úthlutað minni, en þá ekki sagt kerfið að það er gert með það. Og svo fer að minna minni í boði fyrir alla aðra forrit að þurfa að deila, því að þú ert leaking-- þessi vefur flettitæki program lekur minni. Hvernig eigum við að gefa minni aftur þegar við erum búin með það? Jæja sem betur fer er það mjög einföld leið til að gera það. Við ókeypis bara það. Það er aðgerð kallað frjáls, það tekur bendi á minni, og við erum gott að fara. Svo skulum segja að við erum í miðja prógramminu, við viljum að malloc 50 stafi. Við viljum að malloc fylki sem getur fær um að halda 50 stafi. Og þegar við komum bendi aftur til að nafn sem bendillinn er orðið. Við gerum allt sem við erum fara að gera við orð, og svo þegar við erum gert við frjáls bara það. Og nú höfum við aftur þá 50 bytes minni aftur á kerfið. Sumir aðrir virka getur notað þær. Við þurfum ekki að hafa áhyggjur af þjáningu a minni leka vegna þess að við höfum frelsi orð. Við höfum gefið minni aftur, svo við erum búin að vinna með það. Þannig að það eru þrír gullnu reglur sem ætti að hafa í huga þegar þú ert virk úthluta minni með malloc. Sérhver blokk af minni sem þú malloc verður leystur áður forritinu lýkur í gangi. Nú aftur, í tækið eða í IDE af þessu tagi gerist fyrir þig samt þegar you-- þetta mun gerast samt þegar kerfið er sagt, allt minni kemur út. En það er yfirleitt gott erfðaskrá æfa alltaf, þegar þú ert búinn, frjáls hvað þú hefur mallocd. Það sagði, það eina sem þú hefur mallocd ætti að vera leystur. Ef þú játar með statically að heiltala, int x hálf-hreinsun, sem býr á mánudaginn, þú ekki þá langar til að losa x. Svo það eina sem þú hefur mallocd ætti að vera leystur. Og loks, ekki frjáls eitthvað tvisvar. Sem getur leitt til annar undarlegt ástand. Svo allt sem þú hefur mallocd þarf að vera leystur. Eina það sem þú hefur malloc ætti að vera leystur. Og ekki frjáls eitthvað tvisvar. Svo skulum við fara í gegnum dæmi hér af því sem sumir virk úthlutað minni gæti litið út blönduð með einhverjum truflanir minni. Hvað gæti gerst hér? Athugaðu hvort þú getur fylgst eftir og giska á hvað er að fara að gerast eins og við förum gegnum allar þessar línur af kóða. Svo við segjum int m. Hvað gerist hér? Jæja þetta er nokkuð augljóst. Ég skapa heiltala breytu sem heitir m. Ég lita það grænt, því það er litur sem ég nota þegar ég er að tala um heiltala breytur. Það er kassi. Það heitir m, og þú getur geyma heiltölur inni af því. Hvað ef ég segi þá INT stjarna a? Jæja það er nokkuð svipað. Ég er að skapa kassi kallað. Það er fær um að halda int stjörnur, ábendingum til heiltölur. Þannig að ég ætla að lita það grænt-ish eins og heilbrigður. Ég veit að það hefur eitthvað að gera með heiltala, en það er ekki sjálft heiltala. En það er ansi mikið það sama. Ég hef búið til kassa. Báðir þessir hægri nú búa á mánudaginn. Ég hef gefið þeim báðum nöfnum. INT stjörnu b jafngildir malloc stærð int. Þetta eitt gæti verið svolítið erfiður. Taka annað og hugsa um hvað þú myndi búast við að gerast á þessari skýringarmynd. INT stjörnu b jafngildir malloc stærð int. Jæja þetta er ekki bara að búa í einn reit. Þetta skapar í raun tvo kassa. Og það bindur, það setur einnig punkt í sambandi. Við höfum úthlutað ein húsaröð minni á hrúga. Takið eftir að efst til hægri kassi það er ekki með nafni. Við mallocd það. Það er til staðar á hrúga. En b hefur nafn. Það er bendi breytu sem heitir b. Sem býr á mánudaginn. Svo það er a stykki af minni sem bendir til að annað. b inniheldur veffang þess blokk af minni. Það þýðir ekki að hafa nafn annars. En það bendir til þess. Svo þegar við segjum INT stjörnu b jafngildir malloc stærð int, að þarna, sem ör sem smella upp á hægri hlið, sem allt hlutur, Ég ætla það birtast aftur, er það sem gerist. Allt sem gerist í sem ein lína af kóða. Nú munum við fá smá meira einfalt aftur. a jafngildir merkið m. Manstu hvað jafngildir merkið m er? Ja það er fær tölu m er. Eða setja meira til skýringar, a benda til m. a jafngildir b. Allt í lagi svo hér er annað. A jafngildir b. Hvað er að fara að gerast að myndinni að þessu sinni? Jæja muna að framsal rekstraraðila verk með því að úthluta gildi á Rétturinn til verðmæti til vinstri. Svo í stað þess að benda á að m, a nú bendir á sama stað að B stig. a ekki benda til b, a bendir þar b stig. Ef bent til b sem myndi hafa verið jafn merkið b. En í staðinn jafnt b bara þýðir að og b eru nú að benda á sama heimilisfang, því inni b er bara netfang. Og nú inni a er sama netfang. m jafngildir 10, líklega The einföld hlutur við höfum gert í smá. Settu 10 í reitinn. Star b jafngildir m plús 2, muna frá ábendingum video hvað stjörnu b okkar þýðir. Við erum að fara að dereference b og setja eitthvert gildi í minnisins. Í þessu tilviki 12. Svo þegar við dereference benda á muna við ferðast bara niður örina. Eða setja annan hátt, við fara að þessi minni heimilisfang og við vinna það á einhvern hátt. Við setja nokkur gildi í það. Í þessari stjörnu tilfelli b jafngildir m plús 2 er bara fara til breytu benti til af b, fara í minni benti til af b, og setja m plús 2 í það, 12. Nú er ég frjáls b. Hvað gerist þegar ég frjáls b? Mundu það sem ég sagði á ókeypis leið. Hvað er ég að segja þegar ég frjáls b? Ég er búin að vinna með það, ekki satt? Ég gef í raun upp minni. Ég gefa það aftur til the kerfi. Ég þarf ekki á þessu lengur er það sem ég er að segja þeim, OK? Nú ef ég segi stjarna a jafngildir 11 þú getur sennilega nú þegar sagt að eitthvað slæmt er að fara að gerast hér, ekki satt? Og reyndar ef ég reyndi sem ég líklega myndi þjást skiptingu kenna. Því nú, þó áður að klumpur af minni var eitthvað sem ég hafði aðgang að, á þessum tímapunkti nú er ég að fá aðgang minni sem er ekki löglegur fyrir mig til að fá aðgang. Og eins og við munum líklega muna, þegar við aðgang minni að við erum ekki að snerta, það er algengasta orsök á skiptingu kenna. Og svo forritið mitt myndi hrun ef ég reyndi að gera þetta. Svo aftur það er góð hugmynd að fá gott æfa og góð venja samofin þegar unnið er með malloc og frjáls, þannig að þú ert ekki skiptingu galla, og að þú notir þinn virk úthlutað minni ábyrgð. Ég er Doug Lloyd þetta er CS50.