C++ Memory Management 5

Kerim Fırat
2 min readMar 13, 2022

C++ Memory Management 1 link

C++ Memory Management 2 link

C++ Memory Management 3 link

C++ Memory Management 4 link

- New vs Malloc() -

Bellek tahsis sürecinde “new” ve “malloc()” kullanımlarını inceledik.Eğer söz konusu bellek tahsisi yapmak ise,genel olarak iki yapı da aynı işi üstleniyor. Ancak tam olarak aynı sayılmazlar.Çünkü “new” komutunun “malloc()”’a göre ayrıca bir avantajı var.Yani “new” sadece bellek tahsisi yapmaz,ayrıca constructor’u çalıştırır.Aşağıdaki basit örneğe göz atalım:

Output:
Foo constructor

Output’da elde edilen contructor “new” satırına aittir.
Yani “Foo *objFoo2 = new Foo();” kullanımına aittir. Dolayısıyla “malloc” sadece bellek tahisisi yapıp bırakırken,”new” bunun yanısıra constructor çalıştıracaktır.Aynı durum “free” ve “delete” için de geçerlidir.

free(objFoo1);
free(objFoo2);
//
delete objFoo1;
delete objFoo2;

Free yapısı sadece ilgili belleği iade ederken,”delete” bunun yanı sıra deconstructor’u çağıracaktır. Dolayısıyla free kullanımında aynı zamanda destructor çağırmamız gerekiyorsa,free’den önce ilgili destructor’u aşağıdaki gibi programcının çağırması gerekir.
Örnek:

objFoo1->~Foo();

Dolayısıyla memory management kavramında,neyi nasıl ve ne amaçla kullanacağımızı analiz ve kesin olarak belirlemek önemlidir.
Gelişigüzel temel görev ve işlevlerine göre kullanım istenmeyen sonuçlara sebep olacaktır.

-Placement new-

New operatörünün bir diğer kullanımı da “placement new” kavramıdır. Bu kullanımda new operatörünün mevcut kullanımda olan,tahis edilmiş bir bellek alanı üzerinde tekrar kullanım uygulamaktır.Yani zaten tahsis edilmiş bir bellek alanında tekrar nesne oluşturmak istiyorsak “placement new” kavramını kullanırız.Bu kullanım şekli özellikle optimizasyon amaçlı oldukça kullanışlıdır. Aşağıdaki örnekte “placement new” kavramını gösterilmektedir.
Örnek tanımlama:

int a = 10;
int *dd = new (&a) int(44); //placement new uygulanması

Output:
a:10
&a:0x7ffc33f523ac
— — — — — — —
a:44
dd:44
&dd:0x7ffc33f523ac
— — — — — — —
Foo constructor
Foo constructor
0x7ffc33f523b8
0x7ffc33f523b8
— — — — — — —
Foo id:55 constructor
448

Placement new kavramı ile çalışırken dikkat etmemiz gereken önemli hususlar var. Bunlardan ilki,placement new kavramı uygulama sırasında önceki nesneyle ilgilenmez,sadece kendisine iletilen bellek adresiyle ilgilenir.

Diğer husus ise,placement new uygulanmış nesneler üzerinden “delete” komutu çalıştıramayacağımızdır.Yani aşağıdaki kullanımlar hatalıdır.

delete foo3;
delete aaa;

Dolayısıyla “placement new” uygulanmış nesneler,yani bu kavram ile oluşturulan nesnelere “delete” uygulanmaz. Çünkü bu kavramda yeni bir bellek alanı tahsisi söz konusu değildir.
Söz konusu olan,daha önce tahsis edilmiş bir belleği kullanmaktır. Bu durumda bellek tahsisi yapılan ancak ana tanımlama olan
Foo *foo = new Foo();” ‘dur.
Dolayısıyla bunun üzerinde “delete” çalıştırmamız gerekir.
Örnek:
delete foo;

Daha basit bir örnek ile konuyu sonlandıralım:

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