C++'da Dinamik Bellek Ayırma

C Da Dinamik Bellek Ayirma



Normalde, C++ programlama dilinde kaynak kodlarını kullanırken, bir derleyici, verileri depolamak için değişkene belleği manuel olarak tahsis eder. Statik belleğin tahsisi olduğu söylenir. Bu, beyan edildikten sonra değiştirilemeyen sabit bir hafızadır. Bu tür bellek tahsisinde, işletim sistemi verileri depolamak için yığını kullanır. Statik tahsiste, bellek, kaynak kod yürütülmeye başlamadan önce tahsis edilir.

Oysa dinamik bellek tahsisinde, yürütme başlarken bellek tahsis edilir. Bu bellek, C++'da çalışma zamanı bellek tahsisi olarak da bilinen çalışma zamanında programcı tarafından manuel olarak ayrılır. Dinamik belleğin boyutu programdaki herhangi bir konumda değiştirilebilir çünkü bildirim anında sabitlenebilecek bir boyuttan bahsetmiyoruz. Değeri yalnızca doğrudan değişkene sağlarız.

Bellek tahsisinin normal değişkenlere göre farkı

Normal değişkenlerde, bir derleyici tarafından tahsis edilen hafıza otomatik olarak tahsis edilir ve serbest bırakılır. Bellek, programcı tarafından dinamik olarak tahsis edildiğinde, kaynak kodun daha fazla yürütülmesinde kullanılmadığında belleği kaldırması veya yeniden yerleştirmesi gerekir. Bu durum, bellek yeniden yerleştirilmeden program sonlandırıldığında 'bellek sızıntısına' neden olur.







Dinamik tahsis için operatörler

C++'da iki operatör, hafıza tahsisi ve serbest bırakma işlemine yardımcı olur: hafızanın daha iyi bir şekilde tahsis edilmesi ve serbest bırakılması için kullanılan 'yeni' ve 'delete'.



Yeni operatör

Bellek ayırma talebini belirtir. Yeni işleç, belleği başlatır ve yeterli bellek varsa, tahsis edilen belleğin adresini işaretçi değişkenine döndürür.



İşaretçi nesnesi = yeni veri - tip ;

Operatörü sil

Tıpkı yeni operatör gibi, ayrılan hafızayı kaldırmak için bir silme operatörü kullanılır. C++'da, programcı bu işleci serbest bırakma için kullanabilir.





# İşaretçi_değişkenini sil;

örnek 1

Bu örnekte, iki işaretçi tanıtacağız: biri tamsayı tipi bir işaretçi ve diğeri bir kayan işaretçi. İşaretçiler, yanlarında bir yıldız işareti kullanılarak başlatılır.

# Int * noktaInt;
# Float *noktafloat;

Bu iki yazıcıyı kullanarak belleği dinamik olarak ayıracağız.



İşaretçilerin dinamik ayırmadaki rolü:
Depolama alanının hafızası, bloklar şeklinde geliştirilmiştir. Ne zaman bir program çalıştırsak veya herhangi bir işlem gerçekleştirsek, bellek o belirli amaç için tahsis edilir. Bu belleğin, o belleğe hangi işleme veya programa izin verildiğini tanımlayan programla ilişkili özel bir adresi vardır. Herhangi bir bellek yuvasına ait olduğu adres aracılığıyla erişilir. Yani bu adres işaretçiler aracılığıyla saklanır. Kısacası, belleğe erişmek ve aynı şekilde belleğin belirli bir bölümünü herhangi bir göreve tahsis etmek için işaretçilere ihtiyacımız var. Adresleri saklamak için işaretçilere ihtiyaç vardır.

Manuel ayırmada belleğin dinamik olarak ayrılması için 'new' anahtar kelimesi kullanıldığından, bellek derleyici tarafından tahsis edilir. Çalışma zamanında bellek ayırmamız gerekmez. Ancak dinamik ayırma rastgele olduğundan, işaretçileri tanımlamamız gerekir ve bağlama işlemi için bu yeni operatör kullanılır.

# Pointint = yeni int;

Benzer şekilde, kayan işaretçi de aynı şekilde bağlanır. Bağlama işleminden sonra, herhangi bir işlem için rezerve etmek istediğimiz belleğe herhangi bir değer atayacağız. İşaretçiyi bildirerek, belleğe belirli bir değer atarız.

# *pointInt = 50;

Nokta yüzmeleri için bir kayan değer de bildirilir. Atadıktan sonra değerleri görüntüleyin.

Tartıştığımız gibi, 'yeni' operatör, hafızayı ayırmak için kullanılırken, 'delete' hafızayı serbest bırakmak için kullanılır. Yani koddaki görevi veya işlemi tamamladıktan sonra göreve ayırdığımız hafızayı kaldıracağız.

Başka herhangi bir işlemin bundan yararlanabilmesi için belleğin bu bölümünü yeniden tahsis etmek daha iyidir. Bu tahsisi her iki işaretçiye de uygulayacağız.

Noktayı sil batmadan yüzmek ;

Kodu metin düzenleyiciye kaydettikten sonra, Ubuntu terminali dosyanın içindeki kaynak kodunu bir g++ derleyicisi aracılığıyla yürütmenize izin verir.

$ g++ -o mem mem.c
$ ./mem

Yürütme üzerine, belleğe atanan değerleri göreceksiniz.

Örnek 2

Bu örnek, kullanıcı etkileşiminin katılımına sahiptir. Kullanıcıdan bir değer içerecek bir sayı değişkeni alacağız. Bu program, sonucu öğrencilerin GPA'sında saklayacaktır. Tüm sonuçlar çalışma zamanında kaydedilecektir.

Kullanıcı öğrenci sayısını girdiğinde, her numaraya göre hafıza tahsis edilir. Sonuçların bellek tahsisinde kullanılacak bir kayan tip işaretçi burada başlatılır.

GPA ondalık gösterimde olduğu için işaretçiyi kayan nokta olarak alıyoruz. Birkaç öğrenciye neden olabileceğinden, GPA için bir işaretçi türü dizisi alıyoruz.

Puan = yeni batmadan yüzmek [ birde ]

'Yeni' anahtar kelimeli bu işaretçi dizisi, yürütmeyi bellekle bağlayacaktır. GPA her öğrenci için girilecektir. Kullanıcının eklemek istediği öğrenci sayısına aşina olmadığımız için, girilen sayıya kadar GPA'yı girmek için bir for döngüsü kullandık. Döngünün her tekrarında, kullanıcıdan öğrenciyi tanımlayan sonucu girmesi istenir. Sonuç kaydedildikten sonra, öğrencilerin tüm GPA'larını görüntülemek için tekrar bir döngü kullanacağız. Sonunda, dinamik depolama amacına ulaşıldığı için işaretçi türü dizisi silinir.

Silmek [ ] puan ;

Şimdi yukarıda belirtilen kodu çalıştıracağız. Kullanıcıdan önce öğrenci sayısını girmesi istenecektir. Daha sonra her öğrenci için not ortalaması girilir.

Örnek 3

Bu örnek, sınıfın nesnesi için yeni ve silme işleçlerini kullanır. Bu sınıf, yaşı depolayan tamsayı türünde özel bir değişken içerir. Bir sınıfın genel bölümünde, yaşı '10' olarak başlatacak yapıcı oluşturulur. Burada, yapıcıda başlatılan yaşı gösterecek başka bir işlev kullanılır.

Şimdi dinamik tahsis için ana programa geçeceğiz. Sınıfın nesnesi dinamik olarak oluşturulur.

Öğrenci * puan = yeni Öğrenci ( ) ;

Nesne oluşturulduğunda, yapıcı otomatik olarak uygulanacaktır. Yaşı almak için bir işlev çağrısı yapılacaktır. Bu, ptr aracılığıyla yapılacaktır.

puan - > yaş almak ( ) ;

Ve sonunda, hafıza serbest bırakılacak.

Çözüm

Dinamik bellek tahsisi, derleyici tarafından tanımlanan sabit depolama yerine programcı tarafından çalışma zamanı yürütmesinde tahsis edilir. Bu tahsis rastgeledir ve kullanıldıktan sonra ortadan kaldırılabilir. Oysa çoğu durumda, kaldırmadan önce yürütme işlemi durur ve bu dinamik ayırma daha sonra bellek sızıntılarına neden olur. Bu olguyu Ubuntu Linux sisteminde C++ programlama dilini kullanarak farklı yaklaşımlarda hayata geçirdik.