160 likes | 383 Views
BM-104 Nesneye Yönelik Programlama Bahar 201 3 ( 8 . Sunu ) ( Yrd . Do ç . Dr. Deniz Dal). new ve delete Operat ö rleriyle Dinamik Bellek Y ö netimi (Dynamic Memory Management).
E N D
BM-104 Nesneye Yönelik Programlama Bahar2013 (8. Sunu) (Yrd. Doç. Dr. Deniz Dal)
new ve delete Operatörleriyle Dinamik Bellek Yönetimi (Dynamic Memory Management) • Dinamik bellek yönetimi programcıya, bellektendinamik olarak yer ayırmak (allocate) vekullandıktansonraayrılan bu alanı belleğe gerivermek (deallocate) için yardımcıolur. (Hem built-in hem de user-defined veritipleriiçin.) • Bu işlemlernewvedeleteoperatörleri yardımıyla gerçekleştirilir. • Bellekte dinamikolarak(boyutu değişken), birdizioluşturmakboyutusabitbirdiziyistatikolarak tanımlamaktanbirçok kezdahakullanışlıdır.
Dinamik Bellek Yönetimi (devam) • newOperatörü • Birsınıfınnesnesiiçin programın çalışmasıesnasında (execution time) (derleme anında(compilation time) değil) nesneninboyutunauygunbiralanıbellekterezerveeder. • Nesnenin yapıcısınıçağırır ve ilk değeratamaişleminigerçekleştirir. • Ve son olarakbunesneyebir pointer atar. • Free store ya da heap • Dinamikolarakoluşturulacaknesneleriçinprogramın çalıştırılmasıesnasındakullanılanözel bellek alanıdır.
Dinamik Bellek Yönetimi (devam) • deleteOperatörü • Dinamikolarakheapteoluşturulmuşbir nesneyiyokeder. • Bu işlemi nesnenin yıkıcısınıçağırarakgerçekleştirir ve boşalanalanıheap e iadeeder. • Belleğin boşaltılanbualanıbaşkanesnelertarafındanya da işletimsistemitarafındanyenidenkullanılabilir. • Dinamikolarakoluşturulmuşbirbellekalanınıkullanımıbittiktensonraserbest bırakmamak“memory leak” denenbirproblemesebepolur. Neden?
Dinamik Değişken ve Nesne Kullanımı • Örnek : • double *ptr1=new double(3.14159); • int*ptr2=newint; *ptr2=16; • Zaman *ptr3=newZaman; • Zaman *ptr4=newZaman(12,45,16); • delete ptr1; • delete ptr2; • delete ptr3; • delete ptr4; deleteoperatörü ptr1pointerının işaret ettiği dinamik bellek alanını yok eder.Pointer değişkenine bu satırdan sonra da new operatörü ile yeni bir dinamik bellek alanı rezerve edilebilir.
Tek Boyutlu Dinamik Diziler diziPtrdinamik dizinin ilk elemanını işaret eder. Dizinin ikinci elemanına diziPtr[1] ile veya *(diziPtr+1) ile ulaşılır. • Dizilerdinamikolarakçalışmaesnasında tanımlanabilirler. • Örnek: • Dinamikolarakoluşturulacakve kullanıcıdan klavye yoluyla temin edilecek diziBoyutu kadar elemanısaklayacakinteger bir dizinindeklarasyonu: • int *diziPtr=new int[diziBoyutu]; • delete [] diziPtr; (!! Kareparantezleredikkat([])!!) • 2 noludeyimdiziPtradlıdinamik dizininbellektetutulduğu alanıistenildiğinde serbest bırakır. • Eğer pointer, içindenesnetutanbirdiziyiişaret ediyorsaöncedizininiçindekinesnelereait yıkıcılarçağrılır vedahasonrabellekserbest bırakılır.
DinamikOlarak Oluşturulmuş Bir Nesnenin Public Üye Fonksiyonlarına Veya Public Üye Değişkenlerine Ulaşmak İçin 2 Yol Vardır Zaman *ptr=new Zaman; BİRİNCİ YOL:ptr->ZamaniGoster(); İKİNCİ YOL :(*ptr).ZamaniGoster();
Uygulama • Kullanıcıdan klavye yoluyla temin edeceğiniz integer bir sayıyı dinamik bir integer dizinin boyutu olarak kullanınız. • Bu dizinin içerisini rastgele sayılarla dolduracak Fonksiyon1 adında bir C++ fonksiyonu tanımlayınız. • Kendisine parametre olarak aldığı bir tamsayı Leyland Sayısı ise geriye true değilse geriye false döndüren Fonksiyon2 adında bir C++ fonksiyonu tanımlayınız. 1 < y ≤ x iken xy + yx formunda ifade edilebilen sayılar Leyland Sayıları olarak adlandırılırlar. 8, 17, 100 ve 1124 Leyland Sayılarından birkaçıdır. • Kendisine parametre olarak aldığı bir alt limit ile bir üst limit arasındaki Leyland Sayılarını alt alta basacak Fonksiyon3 adında bir C++ fonksiyonu tanımlayınız. • Dinamik bir integer dizinin içerisindeki Leyland Sayılarını bularak ekrana basacak Fonksiyon4 adında bir C++ fonksiyonu tanımlayınız.