C++11 ile birlikte gelen Smart Pointer sınıfları, bellek yönetimini kolaylaştırmak için tasarlanmıştır Smart pointer sınıfları, otomatik bellek yönetimi, dinamik bellek ayırma, bellek temizleme ve daha az bellek hatası yapılmasını içerir Unique Pointer, sadece bir sahibi olan bir nesne yönetimi sağlarken, Shared Pointer, çoklu sahiplik durumları için bellek yönetimini sağlar Weak Pointer, Shared Pointer kullanımında bellek sızıntısını önlemeye yardımcı olur ve nesnenin hayatta kalmasını kontrol eder Smart Pointer sınıflarının kullanımı, bellek yönetimindeki hataları önlemeye yardımcı olur ve bellek hatası yapma olasılığını azaltır

C++11, diğer C++ sürümlerinden farklı olarak bellek yönetimini kolaylaştırıcı, akıllı pointer sınıfları sunmaktadır. Bellek hatalarının önüne geçmesi amaçlanan bu akıllı pointer sınıfları, kodlama hayatını önemli ölçüde kolaylaştırmaktadır. Smart pointer sınıfları, bellek yönetiminde daha az hata yapılmasını sağlar. Smart pointer sınıflarının özellikleri, bellek yönetimini otomatikleştirme, dinamik bellek ayırma ve belleği temizleme gibi başlıklardır. Smart pointer sınıfları, programlama esnasında bellek yönetiminden kaynaklanan hataların önüne geçmek için kullanılır. Bu sınıflar, kod yazarken bellek ayırma işlemini kolaylaştırmaktadırlar. Smart pointer sınıfları arasında başlıca üç tip bulunmaktadır: Unique Pointer, Shared Pointer ve Weak Pointer.
Unique Pointer
C++11 sürümü ile birlikte gelen Smart Pointer sınıfları, kod yazma işlemini daha güvenli ve kolay hale getirmiştir. Bu sınıflar bellek yönetimini tam otomatik hale getirerek programcıların bellek yönetimine daha az zaman ayırmasını sağlamıştır. Unique Pointer sınıfı, sadece bir sahibi olabilen bir nesne yönetimi sağlar. Yani, bir nesne yaratıldığında sadece bir adet Unique Pointer'ın işaret etmesine imkan tanınır. Dolayısıyla, sahibi olan pointer nesne ömrü tamamlandığında otomatik olarak bellekten kaldırılır. Bu özellik, manuel bellek yönetimindeki problemleri minimuma indirir.
Bir başka deyişle, Unique Pointer tek sahiplik garantisi verir ve dolayısıyla, birden çok unique pointer nesnesi oluşturulamaz. Eğer bir nesneyi başka bir unique pointer'a atamak isterseniz, önce eski sahibinden vazgeçmeniz gerekir. Bu sayede, nesnenin bir sahibi olduğu zamanlarda yönetimi garantilenmiş olur ve bu nesneye bir daha erişmeniz mümkün hale gelir. Ayrıca, nesnenin ömrü unique pointer nesnenin tamamlandığı anda otomatik olarak silinir ve dolayısıyla, bellek sızıntısı gibi problemler yaşanmaz.
Unique Pointer sınıfı, smart pointer sınıfları arasında en güvenli olanıdır. Çünkü, bellek yönetimindeki sorunları ortadan kaldıran bir yapısı vardır. Bu nedenle, C++11 sürümünden itibaren, bellek yönetiminde manuel yöntemler yerine smart pointer'ların kullanımı içlerinde özellikle Unique Pointer'ın kullanımı önerilmektedir.
Shared Pointer
C++11 ile birlikte gelen akıllı işaretçi sınıfları, bellek yönetiminde meydana gelebilecek hataları önlemeye yardımcı olurken, bellek yönetimi işlemini otomatikleştirmektedir. Smart pointer sınıfları arasında yer alan Shared pointer, çoklu sahiplik durumlarında bellek yönetimini sağlamak için kullanılır.
Bir shared pointer nesnesi, birden fazla işaretçi tarafından tutulabilecek olan bir kaynak için kullanılabilir. Bu durumda, kaynak paylaşımı gerçekleşir ve bellek yönetimi otomatik olarak yapılmaktadır. Bu sayede, bellek yönetiminde meydana gelebilecek hataların önüne geçilir.
Shared pointer sınıfı, sahip olduğu bir use count yapısı ile kaynağın kaç tane işaretçi tarafından kullanıldığını takip eder. Eğer kaynak hiçbir işaretçi tarafından kullanılmıyorsa, bellekten otomatik olarak serbest bırakılır. Ancak, birden fazla işaretçi bu kaynak için referans tutuyorsa, use count değeri artar ve kaynak serbest bırakılmaz.
Özellik | Açıklama |
---|---|
shared_ptr<T> | Tür T olan bir shared pointer nesnesi oluşturur. |
reset() | İşaretçiyi sıfırlar ve kullanılan kaynağı bellekten serbest bırakır. |
get() | İşaretçinin tuttuğu nesne adresini döndürür. |
Bu sınıfın kullanımı, manuel bellek yönetiminde karşılaşılan sorunların önüne geçip, bellek yönetim işlemini kolaylaştırdığı için oldukça önemlidir. Ancak, aynı kaynak için birden fazla shared pointer kullanılırsa, döngüsel referans problemleri ortaya çıkabilir. Bu durumda, weak pointer sınıfı kullanarak referans takibini güvenli bir şekilde yapabiliriz.
Weak Pointer
Weak Pointer, C++11 Smart Pointer sınıflarının bir üyesidir ve bir nesnenin hayatta kalma garantisi sağlarken aynı zamanda döngüsel referans problemi yaşanması durumunda da bellek sızıntısını önlemeye yardımcı olur. Weak Pointer, sahip olduğu nesnenin hayatta olup olmadığını kontrol eder ve eğer nesne hayatta kalmışsa ona erişim sağlayarak güvenli bir referans oluşturur.
Weak Pointer kullanımı genellikle Shared Pointer kullanımı ile birlikte gelir. Shared Pointer kullanımında ise, bir nesneye birden fazla sahip olunabileceği için bellek yönetimi daha karmaşık hale gelebilir. Weak Pointer, Shared Pointer referanslarının takibini yapar ve nesnenin hayatta kalmadığı durumda Shared Pointer referansını null olarak ayarlar. Bu sayede, bellek sızıntısı oluşmadan nesne silinebilir.
Ayrıca, Weak Pointer'lar, bir nesne tarafından tutulduğu zaman, nesnenin hayatta kalmasını sağlamazlar. Weak Pointer, sadece referans takibini yapar ve nesnenin hayatta olup olmadığını kontrol eder. Bu nedenle, bir nesne için Weak Pointer kullanmak, onu nesnenin hayatta kalması için güvence altına almaz.
Weak Pointer'ların kullanımı, Shared Pointer'lar gibi bir "use count" veya "reference count" değerine sahip değildir. Bunun yerine, Weak Pointer, Shared Pointer'ın "use count" değerini takip eder. "Use count" sıfıra ulaştığında, nesnenin hayatta kalmadığı (azami ömür döngüsünün bittiği) anlaşılır ve bu durumda Weak Pointer referansı null bir değere sahip olur.
Overall, Weak Pointer kullanımı, bellek yönetiminde büyük bir yardımcıdır ve bellek sızıntısını önlemek için kullanılabilir. Ancak, doğru kullanımı için dikkatli olunmalı ve bir nesne için Weak Pointer kullanmak, o nesnenin garantili olarak hayatta kalacağı anlamına gelmez.
Use Count ve Reference Count Farkı
C++11 Smart Pointer sınıfları, otomatik bellek yönetimini sağlayarak manuel bellek yönetiminde yaşanan sorunların önüne geçerler. Shared Pointer sınıfı ise, tek sahiplik garantisi yerine çoğul sahiplik durumlarında bellek yönetimi yapabilen bir sınıftır. Shared Pointer sınıfının bellek yönetimindeki rolünü anlamak için Use Count ve Reference Count kavramlarına bakmak gerekir.Use Count, bellek bloğuna kaç tane Shared Pointer sınıfın referans yaptığını belirtir. Reference Count ise bellek bloğu için kaç tane Shared Pointer sınıfının oluşturulduğunu belirtir. Bellek bloğuna yapılan her referans artışı, Use Count'ı bir arttırırken, bellek bloğunun kullanımı değiştirildiğinde Reference Count değişir. Bellek bloğuna referans yapılan her bir Shared Pointer nesnesi, Reference Count'u arttırmaktadır.Eğer bellek bloğunun Use Count değeri sıfıra düşerse, bellek bloğu silinir ve bellek özgürleştirme gerçekleşir. Bu özellik, gerekli bellek boşluğunun kullanımından sonra otomatik olarak bellek alanını serbest bırakarak kod tekrarını azaltır ve bellek yönetimi kaynaklarının kullanımını optimize eder.Shared Pointer sınıfının bellek yönetimi, Use Count ve Reference Count işlemleri sayesinde daha güvenli ve tutarlı bir şekilde yapılır. Bellek bloğu tek sahipli bir Shared Pointer tarafından kullanıldığında, Use Count 1 iken, Reference Count 1'dir. Ancak, bellek bloğu birden fazla Shared Pointer tarafından kullanılırsa, Use Count değeri artar ve bellek bloğunun silinmesi yalnızca tüm Shared Pointer nesnelerinin bellek bloğundan çıkmasıyla gerçekleşebilir.
C++11 Smart Pointer'ların Avantajları
C++11'in getirdiği en önemli yeniliklerden biri de Smart Pointer sınıflarıdır. Bu sınıflar, bellek yönetimine ilişkin manuel işlemlerin yapılmasından kurtulmayı sağlar ve bu sayede bellek sızıntıları, null pointer exceptions gibi problemlerle zaman kaybetmemizi önler. Özellikle büyük ölçekli projelerde, bu özelliklerin sağladığı kolaylık büyük avantajlar sunar. Bu sayede, kod kalitesi ve projelerin yönetiminde büyük kolaylıklar sağlar.
Manuel bellek yönetiminde, hafıza ayırma ve serbest bırakma işlemlerinin her biri manuel olarak yapılır. Bu durum, özellikle büyük ölçekli projelerde işleri oldukça güçleştirir. Kendi donanımını yazmak zorunda kalmak, hatalarla karşılaşmak, projenin yönetiminin zorlaşması gibi problemler ortaya çıkar. Ancak Smart Pointer sınıfları sayesinde, bellek yönetimi işlemleri otomatik olarak yapılabildiğinden projelerin yönetimi ve bakımı daha kolay hale gelir. Bu da projelerin kalitesini ve verimliliğini artırır.
- Smart Pointer Sınıflarının avantajları:
- Null pointer exceptions, bellek sızıntıları gibi problemlerin önlenmesi
- Bellek yönetimi işlemlerinde manuel işlemlerden kurtulunması
- Büyük ölçekli projelerde kod yönetiminin ve yönetilebilirliğin artırılması
- Projelerin verimliliğinin ve kalitesinin artırılması
Make_Unique ve Make_Shared Kullanımı
C++11 ile birlikte gelen smart pointer sınıfları, otomatik bellek yönetimi sağlar ve manuel bellek yönetiminden kaynaklanan hataların önüne geçilir. Make_Unique ve Make_Shared, nesne oluşturma işlemini kolaylaştıran yöntemlerdir.
Make_Unique, yeni bir nesne oluşturarak unique_ptr sınıfının bir örneğini döndürür. Bu sayede otomatik bellek yönetimi gerçekleştirilir ve daha az hata oluşur. Make_Shared ise, shared_ptr sınıfında yeni bir örnek oluşturur ve nesneyi paylaşan birden fazla sahip olmasına olanak sağlar.
Buna ek olarak, C++11 smart pointer sınıfları atama operatörünü kullanmayı da kolaylaştırır. std::move ve swap fonksiyonları, nesnelerin sahipliğini devretmek için tercih edilen yöntemlerdir.
Ayrıca, smart pointer sınıfları ile birlikte döngüsel referans problemlerini de çözmek mümkündür. Weak Pointer sınıfı, silinmiş bellek alanlarına erişme problemlerini önler.
Make_Unique ve Make_Shared, C++11'in getirdiği en büyük kolaylıklardan biridir. Bu özellikler sayesinde nesne oluşturma işlemi daha az hata ile gerçekleştirilebilir ve manuel bellek yönetimi gibi problemler minimizedilir.
Weak Pointer'ların Kullanımı
C++11 Smart Pointer sınıfları bellek yönetimini kolaylaştırırken, döngüsel referans problemlerini çözmek için de güçlü bir araç olan Weak Pointer sınıfı kullanımı oldukça önemlidir.
Döngüsel referans problemleri, bir nesnenin referansı kendine veya başka bir nesne tarafından tutulduğunda ortaya çıkan optimize edilmemiş bellek işlemleridir. Bu problemler, bellek sızıntılarına ve program çökmesine neden olabilir.
Weak Pointer, Shared Pointer'ın işaret ettiği nesnenin bellek alanı serbest bırakıldığında bile kullanımını sürdürmesine izin veren, ancak belleği etkilemeyen bir referans tutucudur. Bu nedenle, Weak Pointer referansı tutulan nesnenin bellek alanını kontrol etmez, yalnızca bu nesneyi işaret eden Shared Pointer güncellenmediğinde oluşabilecek döngüsel referans problemlerini çözer.
Weak Pointer kullanımında bir diğer önemli kavram "expired" yani sona ermiş durumdur. Bir Weak Pointer kullanıldığında işaret ettiği Shared Pointer'ın nesnesi bellek alanından silinmiş ise Weak Pointer'ın "expired" durumu true olur. Bu özellik Weak Pointer'ın kontrolsüz bir bellek bölgesi üzerinde işlem yapmasını önleyerek programın daha güvenli çalışmasını sağlar.
Bir diğer önemli konu, bir Shared Pointer nesnesinin bellek alanı serbest bırakıldıktan sonra Weak Pointer nesnesi üzerinden bellek alanına tekrar erişmeye çalışılırsa, hafıza yönetimi açısından bir hata oluşur. Bu gibi ortak hataların önüne geçilebilmesi için, Weak Pointer kullanımı programlama uygulamalarında özellikle dikkat edilmesi gereken bir konudur.
Smart Pointer Kullanımının Kolaylaştırılması
C++11 Smart Pointer'ları kullanarak bellek yönetimi kolaylaşıyor. Atama operatörü kullanılırken std::move ve swap fonksiyonları, bellek yönetim sürecini daha da basitleştirir.
std::move, bir nesnenin sahipliğini devretmek için kullanılır. Eski sahibi kaybederken, yeni sahip kendi nesnesinin referansını avantaj olarak kullanabilir. Bununla birlikte, atama geçen referanslar, kaynak nesnelerin yönetimini kolaylaştırarak bellek tasarrufu sağlar.
Swap fonksiyonları, bellek yönetimi sürecini hem daha basit hem de hızlı hale getirir. Bellekten sıfır taşıma maliyetiyle yapabilirsiniz. Bu fonksiyonlar bellek alanlarını değiş tokuş eder ve böylece geçerli iki nesne oluşturulur.
Ayrıca, Smart Pointer kullanımının etkinliğini artıran bir strateji, giriş/çıkış değerli fonksiyonlar kullanmaktır. Bu tür fonksiyonlar, başka bir fonksiyona nesne geçirmeye sık sık ihtiyaç duyan bir yapıya sahipken, bellek yönetimi kendi içinde yapılabilir.
Bu yöntemle, bir türden diğerine aktarılmadan önce nesne değiştirildiğinde, ya bellek kaynakları boşta kalır ya da maliyeti daha yüksek temizleme işlemi yapılır. Smart Pointer kullanılarak, bellek yönetim sürecini basitleştiren bu yöntem, işlem hacmini azaltır ve kodun karmaşıklığını azaltır.
Swap fonksiyonları ve giriş/çıkış, Smart Pointer kullanımının kolaylaştırılması için çok önemli yöntemlerdir. Bu yöntemler, bellek yönetimi sürecini optimize eder ve kodun okunabilirliğini ve erişilebilirliğini artırır.