Pointers and Memory Management (İşaretçiler ve Bellek Yönetimi)
İşaretçiler ve Bellek yönetimi, genel sistem performansını artırmak için programlara bellek alanı atayarak bilgisayar belleğini yönetme işlemidir.
Bellek yönetimi neden gereklidir?
Dizilerin homojen verileri depoladığını bildiğimizden, çoğu zaman bellek, bildirim zamanında diziye ayrılır. Bazen, tam bellek çalışma zamanına kadar belirlenmediğinde durum ortaya çıkar. Böyle bir durumdan kaçınmak için, maksimum boyutta bir dizi bildiririz, ancak bazı bellekler kullanılmaz. Bellek israfını önlemek için, hafızayı çalışma zamanında dinamik olarak ayırmak için yeni operatörü kullanırız.
Bellek Yönetimi Operatörleri
C dilinde, hafızayı çalışma zamanında dinamik olarak ayırmak için malloc() veya calloc() işlevlerini kullanırız ve dinamik olarak tahsis edilen belleği ayırmak için free() işlevi kullanılır. C++ da bu işlevleri destekler, ancak C++ aynı görevleri yerine getirmek için new ve delete gibi sıradan işleçleri, yani belleği ayırmak ve boşaltmak için de tanımlar.
Syntax (Sözdizimi)
pointerDegiskeni = new veri-tipi;
Yukarıdaki sözdizimi, yeni işleci kullanarak nesneyi oluşturmak için kullanılır. Yukarıdaki sözdiziminde, “pointerDegiskeni ” işaretçi değişkeninin adı, ‘new’ operatörü ve ‘veri türü’ verilerin türünü tanımlar.
New
Burada veri türü, bir dizi dahil herhangi bir yerleşik veri türü olabilir veya kullanıcı tanımlı herhangi bir veri türü sınıf veya yapı içerir. Yerleşik veri türleriyle başlayalım. Örneğin, int yazmak için bir işaretçi tanımlayabilir ve ardından belleğin yürütme zamanında tahsis edilmesini talep edebiliriz.
int *degiskenAdi = NULL; degiskenAdi = new int; float *degiskenAdi2 ; degiskenAdi2 = new float;
Belleğin depolama alanı tamamı kullanılmışsa , bellek yetersiz olabilir. Bu nedenle, yeni operatörün NULL işaretçisi döndürüp döndürmediğini kontrol etmek ve aşağıdaki örnekte görebiliriz.
Örnek:
#include <iostream> using namespace std; int main() { int* degiskenAdi = NULL; if(!(degiskenAdi = new int)) { cout << "Bellek Yetersiz." <<endl; } else { cout << "Bellek Yeterli." <<endl; } return 0; }
Çıktı:
Bellek Yeterli.
Delete
Herhangi bir noktada, dinamik olarak ayrılmış bir değişkenin artık gerekli olmadığını hissettiğinizde, belleğin depoda kapladığı belleği delete operatörü ile aşağıdaki gibi boşaltabilirsiniz.
Syntax (Sözdizimi)
delete pointerDegiskeni;
Örnek:
#include <iostream> using namespace std; int main() { float* dAdi = NULL; // Null ataması yaptık. dAdi = new float; // Float değişkeni için bellek istiyoruz. *dAdi = 16487.6; // Atanan adreste belleğin değerini belirledik. cout << "dAdi değişkenin değeri: " << *dAdi << endl; delete dAdi; // hafızayı boşalttık. return 0; }
Çıktı:
dAdi değişkenin değeri: 16487.6
Diziler için Dinamik Bellek Ayırma
Syntax (Sözdizimi)
pointerDegiskeni = new veri-tipi[boyut];
Bir tamsayı dizisi, yani 16 karakterlik bir tamsayı için bellek ayırmak istediğinizi düşünün. Yukarıda kullandıklarımızla aynı sözdizimini kullanarak belleği aşağıda gösterildiği gibi dinamik olarak ayırabiliriz.
int *dAdi= new int[16];
Yeni oluşturduğumuz diziyi bellekten serbest bırakmak için aşağıdaki kod parçacığını kullanmalıyız.
delete[] dAdi;
Yeni operatörün benzer genel sözdiziminin ardından, çok boyutlu bir dizi için aşağıdaki gibi yapabiliriz.
float** dAdi = new float[5][6];
Bununla birlikte, çok boyutlu dizi için belleği serbest bırakmaya yönelik sözdizimi yine de yukarıdakiyle benzer şekildedir.
delete[] dAdi;
Örnek:
#include <iostream> using namespace std; int main() { int boyut; cout<<"Ondalıklı sayı dizisi kaç boyut olsun: "; cin >> boyut; double *dDizi = new double[boyut]; for(int c=0;c<boyut;c++) { cout << "Dizinin " << c+1 << ". elemanı: "; cin >> dDizi[c]; } cout << endl << "Dizinin elemanları:" << endl; for(int c=0;c<boyut;c++) { cout << c+1 << ". elemanı: " << dDizi[c] << endl; } delete dDizi; return 0; }
Giriş:
Ondalıklı sayı dizisi kaç boyut olsun: 7 Dizinin 1. elemanı: 17.54 Dizinin 2. elemanı: 325.154 Dizinin 3. elemanı: 65.1458 Dizinin 4. elemanı: 4123.41 Dizinin 5. elemanı: 15.87 Dizinin 6. elemanı: 6482.6 Dizinin 7. elemanı: 1.58
Çıktı:
Dizinin elemanları: 1. elemanı: 17.54 2. elemanı: 325.154 3. elemanı: 65.1458 4. elemanı: 4123.41 5. elemanı: 15.87 6. elemanı: 6482.6 7. elemanı: 1.58