[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.