Tuesday

13

December

2016


0

YORUM


Compe 225 | C++ Ders 10 Memory Allocation Nedir ?

7 ay önce yazıldı

c++,compe 225,delete,ders notları,ders notu,memory allocation,nedir,new,örnekler,davutkara(new , delete bu konunun özeti.)

Memory allocation Türkçesi bellekten alan almak oluyor. Yani bilgisyar hafızasından programımıza dönüm dönüm arsa parselliyebiliyoruz, -illa her yeri parselliycek değiliz bazen 1 tane yer de alabilmemiz gerekiyor.

Avantajı ise aldıklarımızı istediğimiz zaman iptal edebilmek. Amacımız bu yani bunu kullanmasak programımız çalıştığı sürece biz memory i işgal ediyoruz, eğer çok fazla veriable bulunan bir programımız varsa bilgisayar bir süre sonra çöküyor. Bu sayede işimiz biten veriable ı silebiliyoruz.

Memory allocation ile veriable alırken ve silirken kullanım şu şekilde.

Öncelikele bir adet pointer oluşturuyoruz daha sonra o pointer a memory allocation ımızı atıyoruz.

int *p;
p = new (type) [2];
p = new int [2];

Başına sadece new eklemiş olduk aslında birde pointer la birlikte kullandık, eğer normal array olarak yapsaydık silemiyorduk ancak şimdi silebiliyoruz. Silerkende şu şekilde.type yerine int,double,float,string her typeı yazabilirsiniz, parantez içinede adetini yazıyorsunuz.Aslında bu şekilde bir array yapmış olduk.

delete [] p;

bu kadar basit (p herhangi yukarda oluşturduğumuz veriable.)

#include <iostream>
int main(){         
                int *p;
                p = new int[3];
                p[0] = 10;
                p[1] = 20;
                p[2] = 30;
                std::cout << p[0] << p[1] << p[2];
                delete [] p ;
                std::cout << p[1];
}
/*Output : 1020300*/

Yukardaki örnekte 10 20 30 ekrana basılır daha sonra delete yaptığımız için p yi tamamen sildiğimiz için p[1] bulunamaz ve 0 ekrana basılır.

Soldaki örneği istediğiniz şekilde değiştirip bakabilirsiniz.

Kullanımı şu şekilde bir genelleyelim.

Data_Type *pointer_veriable;

Pointer_veriable = new data_type;

İlk sayfada, tanımlama yaparken her türlü type ın yazılabileceğini söylemiştim, Dolayısıyla notarımızın en başını hatırlarsak class tanımlarken aslında bir nevi veri type tanımladığımız belirtmiştim. Bundan dolayı (int) (double) vs yazarken aynı zamanda hazırladığiımız class ın adını da yazabiliriz bu sayede oluşturduğumuz objeyi silinebilir yapabiliriz.

#include <iostream>
class Evegit{
public:
int saat = 0;
void durumne(){
if(saat  > 8)
printf("Saat %d Eve GİT",saat);
else
printf("Daha Vakit Var \n");
}
};
int main(void){
Evegit *p;
p = new Evegit;
p->durumne();
delete [] p;
p->durumne();
return 0;
}

 

Yukarda yazdığım genel tanımı yandaki örnekle beraber incelediğimiz de Evegit class ı nın bir data_type olduğunu bildiğimiz için anlamamız kolay olacaktır.

Buraya kadar anlatmadığım ve bizim için yeni olan şey ise pointer objesinde bağlama operatörümüzdür.

->

Eğer pointerımız bir objeyi gösteriorsa ve biz pointer üzerinden bu objedeki herhangi bir attribute(veriable) veya method(function) a erişmek istiyorsak normalde bildiğimiz nokta operatörü yerine burda -> bir nevi ok şeklinde olan operatörümüzü kullanıyoruz.

Yukarıdaki örneği çalıştırdığınızda Öncelikle p oluşturduğu için ve saat= 0 olduğu için ekrana Daha vakit var yazacaktır. Ancak p yi sildikten sonra saat değişkenide silineceği için p nin gösterdiği methoda tekrar erişmeye çalıştığımızda function düzgün çalışmayacaktır.

Aslında mantıken p nin de silinmesini bekliyoruz yani bu durumda hata vermesi gerekir ancak compiler hata vermedi. Ama bizim amacımız memory den alan boşaltmak olduğu için bu yöntemi kullanıyoruz.

Bu da böyle ilginç bir şeydir, özetle memory allocation ın class larla da kullanılabileceğini ve kullanım olarak new,delete i bilseniz yeter.

memalloc1 memalloc2 memalloc3