C++ Dinamik Hafıza

Konuyu daha iyi anlayabilmek için önce C++ programlarında hafızanın ikiye ayrıldığını söyleyelim. Bunlar;

Stack: Fonksiyonların içinde tanımlanmış değerler burada tutulur.
Heap: Program tarafından kullanılmayan ancak runtime sırasında kullanılabilecek alan

Program çalışmadan önce ne kadar hafıza kullanacağı belirlenir(Stack). Ancak siz new keyword’ünü kullanarak runtime sırasında dinamik değerler oluşturabilirsiniz. Silmeniz gerektiğinde ise delete keyword’ünü kullanarak bu değer için ayırdığınız hafızayı serbest bırakabilirsiniz.

Syntax

new veritipi; // dinamik veri oluşturma

Burada veritipi arrayler dahil olmak üzere C++ içinde tanımlı ya da sizin sonradan oluşturduğunuz bir sınıf objesi olabilir.

Şuna dikkat etmemiz gerekiyor. Dediğimiz gibi new keyword’ünü kullarak değişken oluşturmak istediğimizde heap’ten hafıza istemiş oluyoruz. Ancak bu hafızayı her zaman alamayabiliriz. Böyle bir hatanın önüne geçmek için;

int *a = NULL;
if(!(a = new int))
{
    cout<<"Hata: Hafıza atanamadı"<<endl;
    return 1;
}

şeklinde bir sağlama yapabiliriz.
Bunu kullanmanızı şiddetle tavsiye ederim eğer a’ya bir değer atanmazsa, sonradan a’yı kullanmaya çalıştığınızda segmentation fault hatası alabilirsiniz.
Silmek istediğinizde ise basit olarak

delete a;

yazabilirsiniz.

Dinamik array oluşturma ve silme

char* kelime = NULL; // pointer oluşturma
kelime = new char[20]; // hafıza isteğinde bulunma
delete[] kelime; // silme işlemi
double** iki_boyutlu = NULL; // pointer oluşturma
iki_boyutlu = double[4][2]; // hafıza isteğinde bulunma
delete[] iki_boyutlu; // silme

Dinamik obje oluşturma

#include <iostream>
using namespace std;
 
class Ornek
{
   public:
   Ornek() { 
     cout<<"Constructor cagirildi!"<<endl; 
   }
   ~Ornek() { 
     cout<<"Destructor cagirildi!"<<endl; 
   }
};
 
int main( )
{
   Ornek* ornekArray = new Ornek[5]; // 5 objeden oluşan dinamik ornekArray'in yaratılması
 
   delete [] ornekArray; // silme işlemi
 
   return 0;
}

Program çıktısı

Constructor cagirildi!
Constructor cagirildi!
Constructor cagirildi!
Constructor cagirildi!
Constructor cagirildi!
Destructor cagirildi!
Destructor cagirildi!
Destructor cagirildi!
Destructor cagirildi!
Destructor cagirildi!

Gördüğünüz gibi arraydeki her obje için constructor ve destructor ayrı ayrı çağırıldı.

Etiketler:

Bir Cevap Yazın