[Muusika mängib]
>> DOUG LLOYD: OK nii soovitus Enne siin.
Kui te ei ole vaatasin videot suunanäitajaks võiksite teha esimene.
Kuna see video on teine töömeetod suunanäitajaks.
>> Nii see läheb rääkima umbes mõned mõisted
et me katta ka suunanäitajaks video, ja me oleme
läheb ilustada neid nüüd eeldades, et nad on juba
omamoodi aru.
Nii et lihtsalt oma õiglane hoiatus et kui te näete seda videot
ja sa ei ole näinud viiteid video, see võib omamoodi
lennata üle oma pea natuke.
Ja nii oleks parem seda vaadata selles järjekorras.
>> Nii et me oleme juba näinud võimalus töötada koos suunanäitajaks,
mis on meil välja kuulutada muutuv, ja siis me
Kinnitan teise muutuja osuti muutuja, mis osutab ta.
Nii oleme loonud muutuja nime, me oleme
loodud teise muutuja nimi, ja juhime et teise muutuja
sel esimesena.
Selline on probleem küll, sest see
nõuab, et me teame täpselt kui palju mälu oleme
läheb vaja praegu Meie programm on koostatud.
>> Miks nii?
Sest me peame suutma nimetada või selgitada kõik võimalikud muutujad
Me võime kohata.
Oleksime massiivi, mis võivad olla suudab palju informatsiooni,
aga see ei ole veel täpselt piisavalt täpne.
Mis siis, kui me ei tea, Mis siis, kui me ei tea,
kui palju me vajame kompileerimise ajal?
Või mis siis, kui meie programm kestab väga kaua aega,
vastu erinevate kasutajate andmed ja me ei saa
hinnata, kas me oleme läheb vaja 1000 ühikut?
>> See ei meeldi saame öelda käsureal
sisestage kui palju punkte sa arvad, et sa pead.
Noh, mis siis, kui see oletus on vale?
Dünaamiline mälu eraldamise omamoodi lubab meile teed
saada umbes seda probleemi.
Ja kuidas ta seda teeb on kasutada vihjeid.
>> Me saame kasutada viiteid pääse dünaamiliselt
eraldatud mälu, mälu, mis on jaotatakse oma programm töötab.
See ei ole eraldatud kompileerimise ajal.
Kui dünaamiliselt eraldada mälu see pärineb bassein
mälu tuntud kui hunnik.
Varem kõik mälus me oleme töötanud käigus
on pärit bassein mälu tuntakse virna.
Hea võimalus üldiselt pidage mind-- ja see reegel
alati ei pea paika, aga päris palju peaaegu
alati hoiab true-- on see, et mis tahes kord, kui muutuja nime
Tõenäoliselt elab virna.
Ja iga kord, kui seda ei tee annab muutuja nimi,
mida saate teha koos dünaamilise mälu jaotamist, see elab hunnik.
>> Nüüd ma olen selline, esitades seda kas seal on need kaks basseinid mälu.
Aga olete näinud seda diagramm, mis on üldiselt
esindamine Mis mälu välja näeb,
ja me ei kavatse hoolivad kõik kraami tipus ja allosas.
Mida me hoolime on see osa Lähis siin, hunnik ja korstna.
Nagu näete, mida Vaadates seda skeemi,
Nende tegelikult ei ole kahe eraldi basseinid mälu.
See on üks ühine bassein mälu kus hakkate, selle visuaalne
hakkate allosas ja alustada tangivad
alt koos virna ja sina teksti algusest ja alustada tangivad
ülalt alla koos hunnik.
Aga see on tõesti Sama pool, see on lihtsalt
eri kohtades, erinevates kohtades mälu, mida jaotatakse.
Ja saab otsa mälu, mis on kas
hunnik minna kogu tee põhja või on
virna minna kogu tee üles, või kellel on pinust
kohtuda üksteise vastu.
Kõik need võivad olla tingimused mis põhjustavad oma programmi
otsa mälu.
Nii et hoidke seda silmas pidades.
Kui me räägime hunnik ja korstna
me tegelikult räägime sama üldise patakas mälu, vaid
erinevatel osadel, et mälu.
>> Niisiis, kuidas me saame dünaamiliselt eraldatud mälu esimese koha?
Kuidas meie programmi saada mälu nagu see töötab?
Noh C on funktsioon, mida nimetatakse malloc, mälu eraldaja, mis
Teile helistada ja sa liigu kui palju baiti mälu, mida soovite.
Seega, kui teie programm töötab ja sa tahad täisarv runtime,
võite mallock neljabaidilist mälu, malloc sulgudes neli.
>> mallock läheb läbi Vaata läbi hunnik,
sest me oleme dünaamiliselt eraldada mälu,
ja siis tagasi sa kursor, et mälu.
See ei anna teile, et memory-- see ei anna talle nime,
see annab sulle viida seda.
Ja seepärast ongi jälle ma ütlesin et see on oluline, et võibolla
jälginud viiteid video enne kui me liiga palju sellesse.
Nii malloc läheb teile tagasi pointer.
>> Kui mallock ei anna teile mingit mälu, sest olete otsa,
see annab sulle tagasi nullviida.
Kas sa mäletad, mis juhtub, kui me proovida ja apparent nullviida?
Me kannatavad seg süü, eks?
See ilmselt ei ole hea.
>> Nii et iga kord, kui helistada to malloc sa alati, alati
on vaja kontrollida, kas pointer ta andis sulle tagasi on null.
Kui see on, mida vaja lõpetada oma programmi sest kui sa püüad ja apparent
null pointer sa lähed kannatavad killustatust süü
ja teie programm on kukku niikuinii.
Niisiis, kuidas me staatiliselt saada täisarv?
>> int x.
Me oleme ilmselt teinud kamp korda, eks?
See loob muutuja nimega x, kes elab virna.
Kuidas me dünaamiliselt saada täisarv?
Int star px võrdub malloc 4.
>> Või õigem me tahaks öelda int star px
võrdub malloc suurus int, lihtsalt visata mõned vähem
magic numbrid ümber meie programmi.
See läheb saada meile nelja baiti mälu hunnik,
ja kursor saame tagasi nimetatakse seda px.
Ja siis nagu me oleme seda varem teinud oleme
saab apparent px, et juurde, et mälu.
Kuidas saada täisarv kasutaja?
Me ei saa öelda, int x võrdub saada int.
See on üsna lihtne.
Mis siis, kui me tahame luua massiivi X ujukid, mis elada korstna?
float stack_array-- see on nimi Meie array-- nurksulgudes x.
See loob meile hulgaliselt X ujukid, mis elada virna.
Me ei saa luua massiivi ujukid kes elab hunnik ka.
Süntaks võib tunduda veidi kohmakas,
kuid me ei saa öelda, float star heap_array võrdub
malloc x korda suurem float.
Mul on vaja piisavalt ruumi, et hoida x ujukoma väärtusi.
Nii et mul on vaja 100 ujukite või 1000 ujukid.
Nii et juhul oleks 400 baiti 100 ujukid,
või 4000 baiti 1000 ujukid, sest iga float võtab
neljabaidilist ruumi.
>> Pärast seda ma ei kasuta nurksulg süntaksi kohta heap_array.
Just nagu ma oleks edasi stack_array, ma pääseb selle elemendid eraldi
kasutades heap_array null, heap_array üks.
Aga meelde põhjus, miks me ei saa seda teha sellepärast, et nimi massiivi C
on tõesti viit et massiivi esimene element.
Nii, et me tunnistamise massiivi ujukeid stack siin
on tegelikult natuke eksitav.
Me tõesti on teine ​​rida koodi seal
Samuti luua kursori patakas mälu, mis me siis teeme mõned tööd.
>> Siin on suur probleem dünaamiliselt eraldatud mälu küll,
ja see on põhjus, miks see on tõesti oluline arendada häid harjumusi
kui te töötate koos sellega.
Erinevalt staatiliselt deklareeritud mälu, mälu
automaatselt ei tagastata süsteemi, kui teie ülesanne on teha.
Nii et kui meil on peamine ja Peamised nõuab funktsiooni
f, siis f viimistluse iganes seda teed ja naaseb kontroll programmi
Tagasi, kõik mälu et f kasutatakse antakse tagasi.
Seda saab kasutada jälle mõne muu programmi
või mõni muu funktsioon, mis saab nimetada hiljem peamine.
Seda saab kasutada sama mälu jälle.
>> Kui teil dünaamiliselt mälu eraldada kuigi
sa pead selgelt öelda süsteem, mis sa oled teinud seda.
Seda saad hoida peale seda teile, mis võiks põhjustada probleeme teist otsa
mälu.
Ja tegelikult me ​​mõnikord viidata sellele nagu Mälulekke.
Ja mõnikord need mälulekked võib tegelikult olla väga laastav
süsteemi jõudlust.
>> Kui teil on sagedased internetikasutaja võite kasutada teatud brausereid,
ja ma ei nimeta nimesid siin, kuid seal on mõned veebibrauserid seal
mis on tuntud oleks tegelikult mälulekked et ei saada fikseeritud.
Ja kui sa jätad oma brauseri avatud väga pikka aega, päeva
ja päeva või nädalat, mõnikord Võib märgata, et teie süsteem
on töötab tõesti aeglaselt.
Ja selle põhjuseks on see, et brauser on eraldatud mälu
kuid siis ei rääkinud süsteemi et ta on teinud seda.
Ja nii, et jätab vähem mälu saadaval kõik teie teised programmid
on jagada, sest sa oled leaking-- et veebilehitseja
Programm lekib mälu.
Kuidas me anname mälu tagasi kui me teinud on?
Noh õnneks on see väga lihtne viis seda teha.
Me lihtsalt vaba ta.
Seal on funktsioon nimega tasuta, ta võtab kursor mälu
ja me oleme hea minna.
>> Ütleme, et me oleme ka Keset meie programmi,
tahame malloc 50 tähemärki.
Tahame malloc massiivi, mis võivad mahub 50 tähemärki.
Ja kui me osuti tagasi et see kursor nimi on sõna.
Me teha mida iganes me kavatseb teha sõna,
ja siis, kui me teinud me lihtsalt vaba ta.
Ja nüüd oleme tagasi need 50 baiti mälu tagasi süsteemi.
Mõned teised funktsiooni saab neid kasutada.
Me ei pea muretsema kannatusi mäluleke sest oleme vabanenud sõna.
Me andsime mälu tagasi, nii ongi kõik töötab ta.
Nii on kolm kuldreeglit, mis tuleks
tuleb silmas pidada, kui sa oled dünaamiliselt eraldada mälu
koos malloc.
Iga ploki mälu sa malloc tuleb vabastada
Enne oma programmi lõpetab töötamise.
Nüüd jälle, et seadme või IDE sellist juhtub nagunii
kui Sa-- see juhtub niikuinii Kui teie programm on lõpetatud,
kõik mälu ilmub.
Aga see on üldiselt hea kodeerimine Praktikas on alati, kui sa oled teinud,
tasuta mida olete mallocd.
>> See tähendab, et ainsad asjad, mis olete mallocd tuleks vabastada.
Kui te staatiliselt tunnistada täisarv, int x semikoolon,
kes elab virna, siis ei, siis tahad, et vabastada x.
Nii ainsad asjad, mis sa oled mallocd tuleks vabastada.
>> Ja lõpuks, ärge tasuta midagi korda.
See võib kaasa tuua teine ​​imelik olukord.
Nii et kõik, mis sa oled mallocd tuleb vabastada.
Ainult asju, mida olete malloc tuleks vabastada.
Ja ärge tasuta midagi korda.
>> Nii lähme näitena siin mida mõned dünaamiliselt eraldatud
mälu tunduda segatud sisse mõned staatilised mälu.
Mis võib juhtuda siin?
Vaadake, kas saate jälgida mööda ja arvan, mida on
juhtub, kui me läheme läbi kõik need rida koodi.
>> Nii me ütleme int m.
Mis juhtub siin?
Jah, see on üsna lihtne.
Ma loon täisarv muutuja nimega m.
Ma värvi see roheline, sest see värv
et ma kasutan, kui ma räägin umbes täisarv muutujad.
See on kast.
Seda nimetatakse m, ja te saate poest täisarvud sees on.
>> Mis siis, kui ma siis ütlen int tärniga?
Noh, et on päris sarnased.
Ma koostan kasti nimega.
See mahub int tähed, vihjeid täisarvud.
Nii et ma värvimine see roheline-ish samuti.
>> Ma tean, et see on midagi pistmist täisarv,
kuid see ei ole iseenesest täisarv.
Aga see on üsna sama mõte.
Olen loonud kasti.
Mõlemad õigus nüüd elan virna.
Ma olen andnud neile mõlemad nimed.
>> int star b võrdub malloc suurus int.
See võiks olla natuke keeruline.
Võtke hetk ja mõelda, mida sa ootaks juhtuda sellel skeemil.
int star b võrdub malloc suurus int.
>> Noh see ei ole lihtsalt luua üks kast.
See loob tegelikult kaks kasti.
Ja see haakub see sätestab ka punkt suhe.
Me oleme eraldatud üks plokk mälu hunnik.
Pange tähele, et üleval paremal kastis seal ei ole veel nime.
>> Me mallocd ta.
See on olemas hunnik.
Aga b on nimi.
See on pointer muutuja nimega b.
See elab virna.
>> Nii et see on tükk mälu mis osutab mõni teine.
b sisaldab aadress Selle ploki mälu.
See ei ole veel nime teisiti.
Aga see juhib ta.
Nii et kui me ütleme, int star b võrdub malloc suurus int, et seal,
et nool, et hüppasid üles paremal pool seal, et kogu see asi,
Võtan tundub uuesti, on see, mis juhtub.
Kõik, mis juhtub et koodirida.
Nüüd saad natuke rohkem lihtne uuesti.
a on võrdne ampersand m.
Kas te mäletate, milline võrdub ampersand m on?
Noh, et on saab m aadressi.
Või panna rohkem diagrammiliselt punktisüsteemi m.
>> a on võrdne b.
OK, nii et siin on veel üks.
A on võrdne b.
Mis juhtub skeemile seekord?
>> Noh meelde tuletada, et omistamisoperaatorile tööd
määrates väärtuse kohta õigus väärtus vasakul.
Nii asemel osutades m, praeguseks juhib samas kohas, et b punkti.
ei viita B, A lõikumispunktid b punkti.
>> Kui terava b-, mis olnud võrdne ampersand b.
Aga selle asemel võrdub b lihtsalt tähendab, et ja b on nüüd
osutades samal aadressil, sest sees b on lihtsalt aadress.
Ja nüüd sees on sama aadress.
m võrdub 10, ilmselt Kõige lihtsam asi
Me oleme teinud natuke.
Pane 10 kasti.
Star b võrdub m pluss 2, mäletate Meie viiteid video, mida täht b tähendab.
Me läheme apparent b ja panna mingi väärtus, et mälu asukohta.
Sel juhul 12.
>> Nii et kui me apparent punkti, mäleta me lihtsalt sõita mööda nool.
Või teisiti öeldes, me minna, et mälu aadress
ja me manipuleerida seda mingil moel.
Panime mingi väärtus seal.
Sel juhul star b võrdub m pluss 2 on lihtsalt
minna muutuja poolt esile tõstetud b, mine mälu, millele viitab b,
ja panna m pluss 2 seal, 12.
>> Nüüd ma vabaks b.
Mis juhtub, kui ma vabaks b?
Pea meeles, mida ma ütlesin tasuta vahendeid.
Mida ma öelda, kui ma vabaks b?
>> Ma olen teinud koostööd, eks?
Ma sisuliselt loobuma mälu.
Ma annan selle tagasi süsteemi.
Ma ei pea seda enam on mida ma räägin nendega OK?
>> Nüüd, kui ma ütlen, tärniga võrdub 11 saab ilmselt
juba öelda, et midagi halba juhtub siin, eks?
Ja tõepoolest, kui ma proovisin, et ma ilmselt kannaksid killustatust süü.
Sest nüüd, kuigi varem, et patakas mälu
oli midagi, mis mul oli juurdepääsu, sel hetkel
nüüd ma juurdepääsu mälu ei ole õiguslikke mulle juurde.
>> Ja nagu me ilmselt mäletate, kui me Access Memory
et me ei peaks puudutama, see on kõige levinum põhjus
on segmenteerimine süü. Ja nii minu programmi
krahhi, kui ma püüdsin seda teha.
Nii jälle, et see on hea mõte hea tavade ja heade harjumuste juurdunud
töötamisel malloc ja tasuta, nii et sa ei kannata segmenteerimine
vead, ja mida saate kasutada Sinu dünaamiliselt eraldatud
mälu vastutustundlikult.
>> Ma olen Doug Lloyd see on CS50.