C++ Memory Management 4

Kerim Fırat
3 min readMar 4, 2022

C++ Memory Management 1 link

C++ Memory Management 2 link

C++ Memory Management 3 link

”Dinamik Olarak Tahsis Edilen Nesneler Ve Init”

Çeşitli şekillerde tanımlanan dinamik nesneler ve bunların davranışlarını görmek için aşağıdaki örneği inceleyelim.

Örneği incelediğimizde boş parantezlere sahip nesnelerin,belirli bir değere sahip olmadan başlatma-init yapmak istediğimiz görülmekte. Yerleşik türler(built-in types) veya primitive(ilkel) tür-tipler olarak adlandırılan türlerin aksine,kendi constructor’larını tanımlayan sınıf(class) türleri söz konusu olduğunda,başlatılmamış olarak bıraksak da veya açıkça başlatma talebinde bulunsak da durum değişmez. Yani her halükarda default olarak constructor tarafından başlatılacaktır.

-C Memory Management (malloc(),calloc(),realloc())-

Önceki yazımda “C”’nin “new” ve “delete” komutlarını desteklemediğini görmüştük. C ile bellek yönetimini incelemeye aşağıdaki fonksiyonların yapısıyla başlayalım. Bu fonksiyonlar <sdlib.h> altında tanımlanmıştır.

Allocation:

“malloc()” fonksiyonunu ele aldığımızda ilk olarak aldığı parametre,ve ikinci olarak ise dönüş tipi dikkatimizi çekebilir. “typedef size_t” bir unsigned türdür. Ancak dönüş tipinin “void” pointer olmasının sebebi ise,malloc() fonksiyonunun bizim onu ne tür bir nesne üzerinde kullanacağımız hakkında bilgisi olmamasıdır. Kısacası malloc() nesne türüyle ilgilenmez. Sadece kendisine parametre olarak verilen boyutu dikkate alarak bellek alanı ayırır ve bu belleği işaret eden bir pointer döndürür. Dönen void pointer’i,belleğe yerleştirilecek nesne türüne dönüştürmek programcıya aittir.
Ancak malloc() tahsis işleminde herhangi bir sebeple başarısız olursa NULL döndürür.
Dolayısıyla ilgili belleği kullanmadan önce NULL ile kontrol edilmelidir.
Çalışma prensibi aşağıdaki şekildedir:
pointer = (cast_type *) malloc(size)

cast_type: Dönüştürmek istenen tip-tür.

Örnek tanımlamalar:
int *pInt = malloc(sizeof(int));
float *ptr = (float*)malloc(10 * sizeof(float));

Örnek:

Örnek 2:

Bir diğer bellek tahsisi için kullanılabilecek fonksiyon ise “calloc()”’dur. Bu fonksiyon dizi mantığında çalışır. Fonksiyonun yapısı aşağıdaki gibidir:

void *calloc(size_t nitems, size_t size)

Fonkiyonun aldığı ilk parametre tahsis edilecek eleman sayısıdır. İkinci parametre ise tıpkı “malloc”’daki gibi her elemanın sahip olacağı boyuttur.
Örnek:

Output:
dizi içeriği: 0 5 10 15 20 25 30 35 40 45

Dolayısıyla “calloc”,malloc() fonksiyonuna benzerdir ancak ardışık-birbirini takip eden “items” sayısı adetince sizeof ile belirtilen boyutta bellek tahsisi yapar.

Yukarıdaki örneği şöyle değiştirip çalıştırırsak:
//array = (int*) calloc(items,sizeof(int));
array = (int*) malloc(sizeof(int));

Output:
malloc(): corrupted top size
Aborted (core dumped)

Çünkü malloc ile int tipinde tek elemanlık bir alan tahsisi yapıldı. Dolayısıyla 10 elemanlı bir işlemde bellek bozulması meydana gelecektir. Ancak “malloc” fonksiyonu da “calloc” gibi kullanılabilir.
Örnek:

array = (int*) malloc(10 * sizeof(int));

Ancak malloc fonksiyonunun calloc gibi kullanılabilir olması tam olarak aynı görevi yapmaz. Çünkü calloc ayırdığı ardışık belleği “0”(sıfır) ile başlatır. Yani her elemana başlangıç değeri olarak 0 değeri atar.

Realloc:

Bellek tahsisi için malloc ve/veya calloc kullanılabilir. Ancak mevcut kullanımda olan bir bellek alanını genişletmek istersek,yani alanı büyütmek istersek “realloc” kullanacağız. Fonksiyonun genel yapısı aşağıdaki gibidir:

void *realloc( void *ptr, size_t new_size );

İlk paremetre genişletmek istediğimiz bellek alanı-bölgesi pointer’i,ikinci paremetre ise ihtiyac duyulan yani tahsis edilecek bellek alanı büyüklüğüdür.
Örnek:

Output:
dizi içeriği:
0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 85 90 95

Deallocation:

free() komutu,belirli bir adresle ilişkili belleği serbest bırakır yani sisteme iade eder.
Böylece iligili bellek alanı tekrar tahsis için kullanılabilir hale gelir.
Örnek:
free(pInt);
free(ptrPerson);
free(obj1);
free(array);

KAYNAKLAR:
https://www.cplusplus.com/
https://en.cppreference.com/w/
https://www.kernel.org/doc/html/latest/admin-guide/mm/index.html
https://www.bogotobogo.com/
https://openjdk.java.net/groups/hotspot/docs/StorageManagement.html

-end of

--

--

Kerim Fırat

Senior C++,Android Platform(AOSP,AAOS) Developer,Performance Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author