[Музички]
>> Даг LLOYD: Добро па предлог пред точно тука.
Ако не сте го гледав видеото на совети можеби ќе сакате да го стори тоа во прв план.
Бидејќи ова видео е уште еден начин на работа со покажувачи.
>> Па затоа се случува да се зборува за некои поими
кои ги покриваат во покажувачи на видео, и ние сме
ќе притајуваат нив сега, под претпоставка дека тие се веќе
вид на разбрани.
Па тоа е само фер вашиот предупредување дека ако го гледате ова видео
а вие не сте виделе покажувачи видео, тоа би можело да вид на
летаат над главата малку.
И затоа таа може да биде подобро да се види тоа во тој редослед.
>> Така што веќе видовме еден начин на работа со стрелки,
кој ние се изјасни за променлива, а потоа ние
прогласи уште една променлива, покажувач променлива, што укажува на тоа.
Па ние направивме променлива со име, ние сме
создаде втор променлива со име, и укажуваме дека втората променлива
во тоа во прв план.
Овој вид има проблем иако, бидејќи тоа
бара од нас да се знае точно колку меморија сме
ќе треба во моментот нашата програма е составена.
>> Зошто е тоа?
Бидејќи ние треба да биде во можност да го именува или идентификуваат сите можни променливи
ние можеби средба.
Ние би можеле да имаат низа што може да биде може да се одржи многу информации,
но тоа се уште не е точно е доволно прецизна.
Што ако ние не знаеме, што ако ние немаме идеја
колку ние ќе треба во компајлирате време?
Или што ако нашата програма ќе траат навистина долго време,
прифаќање на различни корисник на податоци, и не можеме да
процени дали сме случува да треба 1.000 единици?
>> Тоа не е како што можеме велат во командната линија
внесете колку елементи Дали мислите дека ќе ти треба.
Па што ако е тоа претпоставка е во ред?
Динамична алокација на меморија вид ни овозможува на начин
да се добие околу овој посебен проблем.
И начинот на кој тоа го прави е со користење на совети.
>> Можеме да го користите совети како да се се добие пристап до динамички
распределени меморија, меморија, која е издвојуваната вашата програма работи.
Тоа не е наменет на компајлирање.
Кога ќе се динамички алоцира меморија доаѓа од еден базен
меморија познат како грамада.
Претходно сите меморија имаме работи со во текот
е што доаѓаат од еден базен меморија познат како оџак.
А добар начин да се генерално задржи во mind-- и ова правило
не мора секогаш да се одржи точно, но доста речиси
секогаш има true-- е дека секоја време да ви даде името на променливата на тоа
најверојатно живее на магацинот.
И во секое време да не стори дадат променлива име,
што можете да направите со динамичка меморија распределба, што живее на грамада.
>> Сега јас сум вид на презентација на тоа како ако има овие два базени на меморија.
Но може да се види ова дијаграм, кој е генерално
претстава на меморија што изгледа,
и ние нема да се грижиме за сите на работи на врвот и на дното.
Она што ние се грижиме само за овој дел во средината тука, грамада и магацинот.
Како што можете да видите со во потрага на овој дијаграм,
тие, всушност, не се две посебни базени на меморија.
Тоа е еден заеднички базен на меморија каде што ќе почнете со, во овој визуелен
ќе почнете на дното и да почне полнењето
од дното со стек, а вие со почеток во врвот и да почне полнењето
од врвот надолу со грамада.
Но, тоа е, всушност, истиот базен, тоа е само
различни места, различни локации во меморијата, кои се распределени.
И можете да ја стартувате од меморија со или имаат
грамада сите одат на патот на дното, или имаат
магацинот одат сите на патот до врвот, или да се има на грамада и магацинот
се сретнат еден против друг.
Сите тие може да се услови кои предизвикуваат вашата програма
да снема меморија.
Па задржи дека во умот.
Кога се зборува за грамада и магацинот
ние навистина зборуваме за истите општи парче меморија, само
различни делови од таа меморија.
>> Така како ние да се динамички распределени меморија на прво место?
Како го прави нашата програма се меморија како тој работи?
И Ц обезбедува функција наречена Примерок, меморија разпределител, која
ќе се направи повик да, и ќе помине во колку бајти од меморија што го сакате.
Значи, ако вашиот програмата се извршува а вие сакате цел број траење,
можеби mallock четири бајти на меморија, Примерок загради четири.
>> mallock ќе поминат низ гледајќи низ грамада,
бидејќи ние сме динамички доделување меморија,
и тоа ќе се врати за вас покажувач на тоа сеќавање.
Тоа не ви даде дека memory-- тоа не го даде името,
тоа ви дава покажувач кон него.
И така тоа е зошто еднаш реков дека тоа е важно да можеби
го гледавме видео на покажувачи пред да се дојде премногу далеку во тоа.
Примерок така ќе ти го врати покажувач.
>> Ако mallock не може да ви даде секое меморија, бидејќи сте непресушни,
тоа ќе ти го врати нулти покажувач.
Се сеќаваш ли што се случува ако ние се обиде и dereference нулти покажувач?
Страдаме грешка секунда, нели?
Тоа веројатно не е добро.
>> Па секој пат кога ќе се направи повик Примерок на вас и секогаш, секогаш
треба да се провери дали или не на покажувачот го даде вас назад е нула.
Ако е така, треба да се стави крај на својата програма бидејќи ако се обидете и dereference
нултата покажувачот си оди да страда дефект на сегментација
и вашата програма е ќе се сруши во секој случај.
Па, како го правиме статички се добие цел број?
>> int x.
Ние, најверојатно, го направиле тоа еден куп пати, нели?
Ова создава променлива наречена X, која живее на магацинот.
Како ние да се динамички се добие цел број?
Int ѕвезда px еднаква Примерок 4.
>> Или посоодветно ние би рекол int ѕвезда пиксели
Примерок еднаква на големината на цел број, само да се фрли некои помалку
магија броеви околу нашата програма.
Ова се случува да се добие за нас четири бајти меморија од грамада,
и покажувачот ќе го добиеме назад кон тоа се нарекува пиксели.
А потоа само како ние сме направено претходно ние
може да dereference пиксели пристап до таа меморија.
Како да се добие цел број од корисникот?
Можеме да кажеме int x е еднаква добие Инт.
Тоа е прилично јасна.
Што ако сакаме да се создаде низа на X плови кои живеат на оџакот?
плови stack_array-- тоа е името од нашите array-- квадратни загради х.
Што ќе се создаде за нас низа на X плови кои живеат на магацинот.
Ние можеме да се создаде низа на плови која живее на грамада, исто така.
Синтаксата може да изгледа малку повеќе незгодни,
но можеме да кажеме плови ѕвезда heap_array еднаква
Примерок x пати поголема од големината на плови.
Ми треба доволно простор да се одржи x подвижна запирка вредности.
Така велат дека ми треба 100 плови, или 1.000 плови.
Така што во тој случај би било 400 бајти за 100 лебди,
или 4.000 бајти за 1.000 лебди, бидејќи секој плови зазема
четири бајти на просторот.
>> Откако ќе го направите тоа, јас да го користите квадратни заградата синтаксата на heap_array.
Исто како што јас би на stack_array, јас може да пристапите до своите елементи поединечно
користење heap_array нула, heap_array еден.
Но, да се потсетиме на причината што можеме да го направи тоа е затоа што името на низа во C
е навистина покажувач Првиот елемент таа низа е.
Значи фактот дека ние сме прогласување Низа на плови на магацинот тука
е, всушност, малку погрешно.
Ние навистина сме во Втората линија на кодот таму
исто така, создавање покажувач на парче паметењето што потоа направи некои работи со.
>> Тука е голем проблем со динамички доделени мемориски иако,
а тоа е зошто тоа е навистина важно да се развие некои добри навики
кога си работат со него.
За разлика од статички прогласи меморија, вашата меморија
не се враќа автоматски на систем, кога вашата функција е направено.
Значи, ако имаме главните, и Главната повикува функција
ѓ, кога ѓ бои што и да се прави и се враќа за контрола на програмата
Назад кон главната, сите на меморија дека f користат е даден назад.
Тоа може да се користи повторно од страна на некои други програма,
или некоја друга функција што добива наречен подоцна во главниот.
Тоа може да ја користат таа истата меморија одново.
>> Ако динамички алоцирам меморија иако
ќе мора експлицитно да кажам систем што ќе се направи со неа.
Тоа ќе го задржи тоа за вас, кои можат да да доведе до проблеми од вас истекува
меморија.
И всушност ние понекогаш се однесуваат на тоа како меморија излегуваат во јавноста.
А понекогаш и овие меморија протекување всушност, може да биде навистина катастрофални
за перформансите на системот.
>> Ако сте често корисник на интернет може да се користат одредени веб прелистувачи,
и јас не ќе го именувам имиња тука, но постојат некои веб-пребарувачи таму
кои се познати по тоа всушност да има меморија протекување, кои не се фиксни.
И ако го оставите вашиот интернет пребарувач со отворен за многу долго време, денови
и денови или недели, понекогаш Може да се забележи дека вашиот систем
е работи многу, многу бавно.
А причина за тоа е што прелистувачот одвои меморија,
но тогаш не кажа на системот дека тоа е направено со неа.
И така што остава помалку меморија достапни за сите твои други програми
мора да ги споделат, затоа што ти си leaking-- дека веб прелистувач
Програмата е протекување меморија.
Како ние да им даде на меморија назад кога ќе завршиш со тоа?
И за среќа, тоа е многу лесен начин да го направи тоа.
Ние само го ослободи.
Има функција наречена слободен, го прифаќа покажувач кон меморијата,
и ние сме добро да отидевме.
>> Па да речеме дека сме во средината на нашата програма,
сакаме да Примерок 50 карактери.
Ние сакаме да се Примерок низа кој може способен да држи 50 карактери.
И кога ќе го добиеме покажувач назад до дека, име кое покажувачот е зборот.
Ние го направи она што ние сме ќе правите со збор,
и тогаш кога сме направено ние само го ослободи.
И сега ние се вратија тие 50 бајти меморија назад до систем.
Некои други функција да ги користите.
Ние не треба да се грижите за страдање меморија излегуваат во јавноста, бидејќи ние ги ослободија збор.
Ние сме со оглед на меморија назад, па ние завршиш работа со него.
Значи постојат три златни правила кои треба
се чуваат во умот секогаш кога сте динамично доделување меморија
со Примерок.
Секој блок од меморија што Примерок вас мора да се ослободи
пред вашата програма ќе заврши со трчање.
Сега повторно во апаратот или во ИРО овој вид на се случува за вас во секој случај
you-- кога тоа ќе се случи во секој случај Кога вашата програма е прекинат,
сите меморија ќе бидат ослободени.
Но, тоа е генерално добра кодирање пракса за да се секогаш, кога ќе завршиш,
ослободи она што сте го mallocd.
>> Тоа, рече, само работите кои сте mallocd треба да бидат ослободени.
Ако статички прогласи цел број, int x точка-запирка,
кој живее на магацинот, вие тогаш не сакате да се ослободи од x.
Па само работите кои сте mallocd треба да бидат ослободени.
>> И на крај, не слободни нешто двапати.
Што може да доведе до друга чудна ситуација.
Значи се што сте mallocd мора да бидат ослободени.
Единствените нешта кои сте Примерок треба да бидат ослободени.
И не се слободни нешто двапати.
>> Па ајде да одиме преку еден пример тука на она што некои динамички доделени
меморија може да изгледа како мешани во со некои статички меморија.
Што може да се случи во оваа ситуација?
Види дали може да се следат заедно и се погоди она што е
ќе се случи како што ние одиме преку сите овие линии на код.
>> Па велиме int м.
Што се случува овде?
Па ова е прилично јасна.
Јас создаде целобројна променлива наречена м.
Јас боја зелена, затоа што тоа е во боја
дека јас го користам кога јас зборувам за целобројни променливи.
Тоа е една кутија.
Таа се вика метри, и може да се Продавница за цели броеви во него.
>> Што ако јас тогаш велат int ѕвезда?
Па тоа е прилично слични.
Јас сум создавање на кутија наречена.
Тоа е состојба на стопанството int ѕвезди, покажувачи на цели броеви.
Затоа, јас сум тоа боење зелено-носталгичната, како и.
>> Знам дека има нешто да се направи со цел број,
но самиот не е цел број.
Но, тоа е прилично многу исти идеја.
Јас направивме кутија.
И двете од овие право сега живеат на магацинот.
Сум ги даде двете имиња.
>> int b ѕвезда еднаква Примерок големината на Инт.
Ова би можело да биде малку незгодно.
Се земе втора и размислува за она што може да се очекува да се случи на овој дијаграм.
int b ѕвезда еднаква Примерок големината на Инт.
>> Па тоа не само да се создаде една кутија.
Ова, всушност, создава две кутии.
И тоа, исто така и за воспоставување точка во врска.
Ние сме распределени еден блок од меморијата на грамада.
Забележи дека во горниот десен кутија таму нема да има име.
>> Ние тоа го mallocd.
Таа постои на грамада.
Но б има име.
Тоа е променлива покажувач наречен б.
Која живее на магацинот.
>> Така, тоа е едно парче од меморијата што укажува на уште еден.
б содржи адресата тој блок од меморија.
Тоа не мора да биде име на друг начин.
Но, тоа укажува на тоа.
Така, кога велиме ѕвезда int b е еднаква големина Примерок на цел број, тоа право таму,
дека стрелката што се појави на десната страна има, дека целата работа,
Ќе морам да изгледа повторно, е она што се случува.
Сето ова се случува во дека една линија код.
Сега ние ќе добиете малку повеќе јасна повторно.
a е еднакво на симболот м.
Се сеќаваш ли што е еднаква на симболот m е?
Па тоа е добива адреса на m.
Или да се стави повеќе diagrammatically, на поени, на м.
>> a е еднакво на б.
OK, па тука е уште еден.
A е еднаков со б.
Што ќе се случи со дијаграмот ова време?
>> Добро да се потсетиме дека оператор задача дела
со доделување на вредност на право на вредноста на левата страна.
Така, наместо на испружен да метри, сега укажува на истото место што б поени.
а не точка на b, A укажува каде б поени.
>> Ако зашилен да б, кои би да е еднаква на симболот б.
Туку, напротив, е еднакво на само б значи дека и b се сега
што укажува на истата адреса, бидејќи внатрешноста на Б е само на адреса.
А сега во внатрешноста на еден е на истата адреса.
m е еднакво на 10, веројатно најдиректниот работа
ние го направивме во малку.
Стави на 10 во кутија.
Ѕвезда б еднаква m, плус 2, се сети од нашите совети видео што ѕвездата б значи.
Ние ќе треба да dereference б и го стави некоја вредност во кои мемориска локација.
Во овој случај 12.
>> Значи, кога ќе dereference точка на потсетиме ние само патуваат одредување на тастатурата.
Или поинаку кажано, ние одат на таа меморија адреса
и ние ја манипулира некој начин.
Ние се стави некоја вредност во таму.
Во овој случај ѕвезда б еднаква метри плус 2 е само
одат во променлива посочени од б, одат на меморија посочени од б,
и го стави метри плус 2 во таму, 12.
>> Јас сега се ослободи б.
Што се случува кога ќе се ослободи б?
Запомни што реков слободни средства.
Што сум јас зборуваш кога ќе се ослободи б?
>> Јас сум се направи да работи со него, нели?
Јас во основа се откаже од меморијата.
Јас го даде назад кон системот.
Не ми треба ова повеќе е она што јас ги кажувам, во ред?
>> Сега ако кажам ѕвезда еднаква на 11 вие веројатно може да
веќе кажам дека нешто лошо ќе се случува тука, нели?
И, навистина, ако јас се обидував дека јас веројатно ќе страдаат дефект на сегментација.
Затоа што сега, иако претходно дека парче меморија
беше нешто што морав пристап до, во овој момент
сега сум пристап меморија, која не е правен за мене да им пристапите.
>> И како што веројатно ќе потсетиме, ако имаме пристап меморија
дека ние не би требало да се допре, тоа е најчестата причина
на сегментација вина. И така мојата програма
ќе се сруши ако јас се обидував да го направите тоа.
Значи, повторно, тоа е добра идеја да се добие добар практика и добри навики вкоренето
кога се работи со Примерок и слободни, така што да не страдаат сегментација
грешки, и што ќе се користи Вашиот динамички доделени
меморија одговорно.
>> Јас сум Даг Лојд ова е CS50.