[MÜZİK OYUN]
>> Doug LLOYD: Tamam yani bir öneri Burada başlamadan önce.
Videoyu izledim değilseniz Bunu ilk yapmak isteyebilirsiniz değineği.
Bu videoyu Çünkü başka işaretçileri ile çalışma yolu.
>> Yani konuşacak Bazı kavramlar hakkında
Biz kapsayan Videoyu değineği ve biz konum
Şimdi onlara geçiştirmeye gidiyor onlar zaten olduğunu varsayarak
tür anladım.
Yani bu sadece adil bir uyarı var Bu bu videoyu görüyorsanız eğer
ve görmedim göstericiler, video, olabilir çeşit
başınızın üzerinde biraz uçmak.
Ve bu yüzden daha iyi olabilir sırayla izlemek için.
>> Yani biz zaten bir gördük yol, işaretçileri ile çalışmak
hangi bir beyan olduğunu Değişken, ve sonra biz
Bir işaretçi başka bir değişken bildirmek Değişken, bunun işaret ediyor.
Yani biz yarattık bir bir isimle değişken, biz ettik
Bir isimde ikinci bir değişken yarattı ve ikinci değişken olduğunu işaret
ilk başta.
Bu tür olan sorun olsa, bunun nedeni
Tam bilmek bize gerektirir ne kadar bellek biz konum
anı ihtiyacımız olacak Program derlenmiştir.
>> Neden?
Biz isim gerekiyor çünkü ya olası tüm değişkenlerin belirlenmesi
Biz karşılaşabilirsiniz.
Biz olabilir bir dizi olabilir birçok bilgi tutabilir,
ama yine de değil Yeterli tam kesin.
Ne bilmiyorsanız, ne hiçbir fikrim varsa
Ne kadar biz derleme zamanında gerekir?
Ya da ne program olacak eğer gerçekten uzun bir süre için çalışacak,
Çeşitli kullanıcı kabul Veri ve biz yapamam gerçekten
Biz ister tahmin 1000 birimleri ihtiyacınız olacak?
>> Biz can gibi değil Komut satırında söylemek
Kaç öğe girmek Eğer gerekir düşünüyorum.
Peki bu tahmin neyin olur?
Dinamik bellek ayırma tür bize yol sağlar
Bu özel sorunu aşmanın.
Ve yolu yapar işaretçileri kullanmaktır.
>> Biz işaretçileri için kullanabileceğiniz dinamik erişmek
olduğunu ayrılan bellek, hafıza Programınızın olarak tahsis çalışıyor.
Bu derleme zamanında tahsis değil.
Ne zaman dinamik tahsis Bellek, bir havuzdan geliyor
bellek yığın olarak da bilinir.
Biz ettik daha önce tüm bellek derste birlikte çalışıyor
Bir havuzdan gelecek olan bellek yığın olarak da bilinir.
Iyi bir yolu genel olarak zihinli ve bu kural tutmak
Her zaman, gerçek tutmaz ama hemen hemen neredeyse
her bir true-- olmasıdır tutar zaman bir değişken adı o verin
Muhtemelen yığını yaşıyor.
Ve her zaman değil mi Bir değişkene bir ad verin,
Dinamik bellek ile yapabileceğiniz hangi tahsisi, bu öbek üzerinde yaşıyor.
>> Şimdi biraz bu takdim ediyorum belleğin bu iki havuzu varsa.
Ama bu görmüş olabilirsiniz genellikle diyagramıdır,
bir temsilini hangi bellek gibi görünüyor
ve biz hakkında umurumda gitmiyorsun altta ve üstte şeyler.
Ne umurumda Bu parçasıdır Burada orta yığın ve.
Eğer görebileceğiniz gibi Bu diyagram bakarak,
Bu aslında iki değil belleğin ayrı havuzlar.
Bu belleğin bir ortak havuzu nerede bu görsel çalıştırma
Eğer altta başlayacak ve dolduruyor başlayın
yığını ile alt ve sizden üstünde başlangıç ​​ve dolduruyor başlayın
öbek ile yukarıdan aşağı.
Ama gerçekten Aynı havuz, bu sadece
Farklı noktalar, farklı yerlerde bellekte ayrılan ediliyor.
Ve dışarı çalıştırabilirsiniz Ya sahip bellek
öbek tüm yol alt, ya da var
yığını, üst tüm yol gitmek veya öbek ve yığını olan
birbirlerine karşı buluşmak.
Bunların tüm koşullar olabilir Bu programı neden
bellek tükendi.
Yani akılda tutmak.
Biz hakkında konuşmak yığın ve
biz gerçekten bahsediyoruz bellek aynı genel öbek, sadece
Bu belleğin farklı bölümleri.
>> Bu yüzden dinamik nasıl alabilirim ilk etapta bellek tahsis?
Program olsun nasıl o çalışıyor gibi bellek?
Peki C olarak adlandırılan bir işlev sağlar malloc, bellek ayırıcısı, hangi
Eğer bir çağrı yapmak ve pass Kaç istediğiniz bellek bayt.
Programınız çalışıyorsa yüzden ve bir tamsayı runtime istiyorum,
Eğer dört bayt Mallock olabilir Bellek, malloc dört parantez.
>> Mallock geçeceği yığın bakarak,
Biz dinamik çünkü bellek ayrılırken,
ve size dönecektir Bu belleğin bir gösterici.
Size bu memory-- vermez o ona bir isim vermez,
size bunu bir işaretçi verir.
Yine dedim yüzden bu yüzden var belki önemli olduğunu
işaretçileri video izledim Biz bu işin içine çok girmeden önce.
Yani malloc gidiyor bir işaretçi size geri verir.
>> Mallock size bir veremem Eğer bellek tükendi, çünkü
Bir null işaretçi size geri vereceğiz.
Eğer biz ne olur hatırlıyor musun denemek ve bir boş gösterici KQUEUE?
Biz doğru bir seg arıza acı?
Muhtemelen iyi değil.
>> Yani her zaman bir arama yapmak Her zaman hep malloc
kontrol etmeniz gerekir olsun veya olmasın o geri null verdi işaretçisi.
Eğer öyleyse, sizin Programı sonlandırmak için gereken Eğer inceleyebilirsiniz denemek ve çünkü eğer
Gittiğin null işaretçi bir segment hataya acı
ve program Zaten çökmesine gidiyor.
Peki nasıl statik biz bunu bir tamsayı elde?
>> int x.
Biz muhtemelen yaptık kez bir demet, değil mi?
Bu adında bir değişken oluşturur yığının üzerinde yaşayan, x.
Nasıl dinamik bir tamsayı alabilirim?
Int Yıldız px malloc 4 eşittir.
>> Ya da daha uygun Biz int yıldız px söyleyebilirim
, int malloc boyutunu eşittir sadece bazı az atmak
Bizim programı etrafında sihirli sayılar.
Bu bizim için elde gidiyor yığından bellek dört bayt,
ve işaretçi elde ederiz ona geri px denir.
Ve sonra biz ettik gibi Daha önce yapılan
can px inceleyebilirsiniz için Bu belleğe erişim.
Nasıl kullanıcıdan bir tamsayı alabilirim?
Biz int x int olsun eşittir söyleyebiliriz.
Bu oldukça basittir.
Biz bir dizi oluşturmak istiyorsanız ne yığınının üzerinde yaşadığımız yüzen x
Bu isim stack_array-- yüzer Bizim array-- Köşeli parantezler x.
Bu bizim bir dizi için yaratacak yığınının üzerinde yaşadığımız ilmiklere x.
Biz yüzen bir dizi oluşturabilirsiniz bu da, öbek üzerinde yaşıyor.
Sözdizimi bir görünebilir daha hantal küçük
ama biz şamandıra diyebiliriz Yıldız heap_array eşittir
malloc x kez şamandıra boyutu.
Ben saklamak için yeterli oda gerekir x kayan nokta değeri.
Yani 100 ihtiyacım demek şamandıralar veya 1000 yüzer.
Yani bu durumda olurdu 100 yüzen için 400 bayt,
veya 1000 yüzen için 4000 bayt, Her şamandıra kadar sürer, çünkü
uzayın dört bayt.
>> Bunu yaptıktan sonra kullanabilir miyim heap_array üzerinde köşeli ayraç sözdizimi.
Sadece ben stack_array yaptığınız gibi, ben bireysel öğelerini erişebilirsiniz
kullanılarak heap_array sıfır, heap_array on.
Ama biz bunu yapabilirsiniz nedenini hatırlamak çünkü C bir dizinin adı
Gerçekten bir göstericidir Bu dizinin ilk elemanı.
Biz ilan ediyoruz gerçeği Yani Burada yığında yüzen dizi
aslında biraz yanıltıcıdır.
Biz gerçekten vardır Orada kod ikinci satırı
Ayrıca bir yığın bir gösterici oluştururken biz o bazı işler yapmak bellek.
>> Burada büyük bir sorun ile var dinamik olsa bellek ayrılmış,
Gerçekten neden ve bu Bazı iyi alışkanlıklar geliştirmek için önemli
ne zaman onunla çalışıyoruz.
Statik ilan aksine Hafıza, Hafıza
otomatik olarak iade edilmezse senin işlevi yapılır sistem.
Ana var ve eğer öyleyse Ana bir işlevi çağıran
f bitirir f o yapıyor olursa olsun ve programın kontrolünü döndürür
sırt, ana bütün bellek kullanılan f geri verilir.
Tekrar kullanılabilir başka bir program tarafından,
ya da başka bir işlev olduğunu ana daha sonra çağrılır.
Yine o aynı bellek üzerinden kullanabilirsiniz.
>> Eğer dinamik gerçi bellek ayrılamadı
açıkça söylemek zorundayım Onunla bitirdiniz sistemi.
Hangi olabilir, sizin için bunun üzerine tutacağım Eğer dışarı çalışan bir soruna yol
bellek.
Ve aslında biz bazen atıfta Bir bellek sızıntısı olarak bu.
Ve bazen bu bellek sızıntısı aslında gerçekten yıkıcı olabilir
sistem performansı için.
>> Eğer sık ​​bir internet kullanıcısıysanız Eğer belirli web tarayıcıları kullanabilirsiniz
ve ben burada isim isim, ama olmaz Bazı web tarayıcıları orada vardır
Aslında olması için azılı olduğunu Sabit alamadım bellek sızıntıları.
Ve tarayıcınızın açık bırakırsanız zaman çok uzun bir süre boyunca, günde
ve gün veya hafta, bazen Sisteminizde fark edebilirsiniz
Gerçekten yavaş, gerçekten çalışıyor.
Ve bunun sebebi olduğunu tarayıcı, bellek tahsis etmiştir
ama sonra sistemi söylemedi o onunla bitti.
Ve böylece daha az bellek bırakır Diğer tüm programlar için geçerli
sen, çünkü paylaşmak zorunda Bu web tarayıcısı leaking--
Program belleği sızdırıyor.
Biz geri bellek vermek nasıl biz onunla bitince?
Peki neyse o var Bunu yapmak çok kolay bir yol.
Biz sadece özgür.
Ücretsiz adında bir işlev var, o, belleğe bir işaretçi kabul
ve biz gitmek için iyi bir konum.
>> Yani biz konum diyelim Programımızın orta
Biz 50 karakter malloc istiyorum.
Biz can bir dizi malloc istiyorum 50 karakter tutabilen.
Ve biz geri bir işaretçi olsun Bu, o işaretçinin adı kelimedir.
Biz konum ne yapmak kelime ile yapacaksın,
ve sonra olduğunuzda biz sadece özgür yapılır.
Ve şimdi biz bu 50 döndü sisteme geri bellek bayt.
Diğer bazı işlev kullanabilirsiniz.
Biz bir acı endişelenmenize gerek yok bellek sızıntısı kelimesini serbest çünkü.
Biz geri hafıza verdik, bu yüzden onunla çalışmaya bittiğinde.
Yani üç vardır O gereken altın kurallar
sen ne zaman akılda tutulmalıdır dinamik bellek ayırma
malloc ile.
Bellek Her blok olduğunu Eğer Malloc serbest olmalıdır
Programınızın önce çalýþmayý.
Şimdi yine, cihazda veya IDE bu tür zaten sizin için olur
Ve sizlere bu zaten olacak Programınız sona erdiğinde,
Tüm bellek çıkacak.
Ama genel olarak iyi bir kodlama var uygulama her zaman için, işiniz bittiğinde,
Eğer mallocd ne özgür.
>> O dedi, sadece şeyler o Eğer mallocd serbest bırakılmalıdır ettik.
Eğer statik bildirirseniz bir tamsayı, int x noktalı virgül,
O rafta yaşıyor, sen Daha sonra x serbest istemiyorum.
Eğer ettik Yani tek şey mallocd serbest bırakılmalıdır.
>> Ve son olarak, iki kez ücretsiz değil bir şey yapmak.
Bu yol açabilir Başka bir garip bir durum.
Eğer ettik Yani her şey mallocd serbest olması gerekir.
Eğer ettik tek şey Malloc serbest bırakılmalıdır.
Ve iki kez değil özgür bir şeyler yapmak.
>> Yani burada bir örnek üzerinden gidelim Bazı dinamik olarak ayrılan ne
Bellek karışık gibi görünebilir bazı statik bellek ile de.
Burada ne olabilir?
Takip edebilirsiniz varsa görün boyunca ve ne tahmin
Biz giderken ne olacak kod tüm bu hatları ile.
>> Yani biz int m söylüyorlar.
Burada neler oluyor?
Peki bu oldukça basittir.
Ben m adında bir tamsayı değişken oluşturmak.
Ben, yeşil renk bu renk çünkü
Ben konuşurken ben kullandıkları yaklaşık tamsayı değişkenleri.
Bu bir kutu.
Bu yapabilirsiniz m denir, ve var bunun içinde mağaza tamsayı.
>> Sonra bir int yıldızı ne derseniz?
Peki bu oldukça benzer.
Ben bir kutu olarak adlandırılan oluşturma.
Bu tutma int yetenekli Yıldız tamsayılar işaretçileri.
Yani ben de o yeşil-ish boyama ediyorum.
>> Ben bir şey olduğunu biliyorum bir tamsayı ile yapmak,
ama bu bir tamsayı değil kendisi değil.
Ama hemen hemen aynı fikir.
Ben bir kutu yarattım.
Bu hakkın ikisi Şimdi yığını yaşıyor.
Ben ikisini de isimlerini verdim.
>> int yıldız b int malloc boyutunu eşittir.
Bu bir biraz zor olabilir.
İkinci alın ve size neyi düşünmek Bu diyagram üzerinde gerçekleşmesi beklenir.
int yıldız b int malloc boyutunu eşittir.
>> Peki bu sadece bir kutu yaratmaz.
Bu aslında iki kutu oluşturur.
Ve o da kurar, bağları Bir ilişkide bir nokta.
Biz bir blok tahsis ettik öbek üzerinde bellek.
Dikkat Sağ üst kutusu Bir isim var yok.
>> Biz bunu mallocd.
Bu öbek üzerinde bulunmaktadır.
Ama b adı vardır.
Bu b adında bir gösterici değişkeni var.
Bu yığının yaşıyor.
>> Yani belleğin bir parça başka birine işaret ediyor.
b adresini içeren belleğin o bloğun.
Aksi takdirde bir adı yok.
Ama buna işaret ediyor.
Yani biz int yıldız b eşittir derken int malloc boyutu, orada o,
üzerine attı o ok Orada sağ tarafında, yani her şey,
Ben görünmesi gerekecek Yine, ne olur.
Tüm bu olur bu kod tek satır.
Şimdi biraz daha alırsınız Yine basit.
Bir işareti m eşittir.
Ne bir hatırlıyor musun işareti m eşittir?
Peki bu m adresini alır var.
Ya da, daha şematik koymak m bir puan.
>> Bir b eşittir.
Tamam işte başka biri.
Bir b eşittir.
Ne olacak şemasına bu kez?
>> Peki hatırlamak Atama operatörü işleri
değerini atayarak Sağ soldaki değere.
M Peki yerine bir işaret Mektup b noktaları aynı yere işaret ediyor.
a, b bir işaret etmiyor b noktaları işaret ediyor.
>> Sivri olduğunu b ise olur Bir işareti b eşittir olmuştur.
Ama onun yerine adil b eşittir yani b şimdi
, aynı adrese çünkü işaret b içinde sadece bir adres.
Ve şimdi içinde aynı adresidir.
m, muhtemelen, 10 eşittir En basit şey
biz biraz yaptık.
Kutuya 10 koyun.
Yıldız b m eşittir artı 2, gelen çağırmak Bizim göstericiler, video hangi yıldız b anlamına gelir.
Biz inceleyebilirsiniz b ve koymak için gidiyoruz Bu hafıza konumuna bazı değer.
Bu durumda, 12,.
>> Peki biz ne zaman bir noktaya inceleyebilirsiniz Biz sadece aşağı ok seyahat anımsıyorum.
Ya da başka bir deyişle, biz Bu bellek adresine gidin
ve biz bir şekilde manipüle.
Biz orada bazı değer koymak.
Bu durumda yıldız b m eşittir artı 2 adildir
değişkene gidin, b işaret belleğe gidin b işaret
ve 12, orada m artı 2 koyun.
>> Şimdi ben b boşaltın.
Ben b serbest zaman ne olur?
Ben özgür anlamına gelir ne dediğini hatırla.
Ben b serbest zaman ne diyorum?
>> Ben onunla çalışmaya bıktım, değil mi?
Ben temelde bellek vazgeçtim.
Ben sisteme geri verir.
Ben artık bu olduğunu gerekmez ne, tamam bunları söylüyorum?
>> Şimdi diyorum eğer yıldızı 11 muhtemelen yapabilirsiniz eşittir
Zaten kötü bir şey söylemek Tamam, işte ne olacak?
Ve ben ben muhtemelen denedim gerçekten eğer bir segment hataya maruz kalacaktır.
Çünkü artık, her ne kadar bellek daha önce bu öbek
Ben vardı şey Bu noktada erişim,
Şimdi belleğe erişim ediyorum Bana ulaşmak için yasal değildir.
>> Ve biz muhtemelen olacaktır Biz belleğe erişirken, hatırlamak
Biz dokunmak zorunda değilsin ki Bu en yaygın nedeni var
Bir segmentasyon arıza. Ve bu yüzden benim programı
Bunu yapmak için çalıştı kilitlenmesine.
Yani yine iyi almak için iyi bir fikirdir uygulama ve iyi alışkanlıklar kökleşmiş
malloc ve ücretsiz çalışırken, böylece segmentasyon olmaz bu
Kullandığınız ve bu arızalar senin dinamik olarak ayrılan
Hafıza sorumlu.
>> Ben Doug Lloyd değilim bu CS50 olduğunu.