C++'de bellek yönetimi, dinamik olarak bellek ayıran ve serbest bırakan new ve delete ifadeleri ile sağlanır. Ancak, manuel yönetimde bellek sızıntısı veya çift serbest bırakma gibi hatalar yapmak kolaydır.
C++11 standartlarının çıkmasıyla birlikte, nesnelerin yaşam döngüsünü otomatik olarak yöneten akıllı işaretçiler — std::unique_ptr, std::shared_ptr, std::weak_ptr gibi — tanıtılmıştır. Bu işaretçiler, kaynakların görünüm alanından çıktıklarında serbest bırakılmasını garanti eder, hatta bir istisna durumunda bile.
Karşılaştırma örneği:
// Manuel bellek serbest bırakma Foo* ptr = new Foo(); // ... delete ptr; // Akıllı işaretçi ile daha güvenli std::unique_ptr<Foo> ptr2 = std::make_unique<Foo>(); // delete gerekli değildir — her şeyi unique_ptr halleder
Akıllı işaretçiler, bellek sızıntısı riskini azaltır ve kodu daha güvenli ve okunabilir hale getirir.
Bir işaretçi için delete'i iki kez çağırırsanız ne olur?
Cevap: İlk delete çağrısından sonra bellek zaten serbest bırakılmıştır. İkinci çağrı belirsiz bir davranışa yol açar (undefined behavior). Örnek:
Foo* p = new Foo(); delete p; delete p; // HATA!
Bunu önlemek için, serbest bırakdıktan sonra işaretçiyi nullptr olarak ayarlayın:
delete p; p = nullptr;
Hikaye
Büyük bir C++ projesinde, bir geliştirici dinamik belleği manuel olarak
deleteile serbest bıraktı ve istisna olan birkaç fonksiyon dalında işaretçiyi silmeyi unuttu. Bu, yalnızca yük testi sırasında tespit edilen bellek sızıntısına yol açtı.
Hikaye
Farklı kod parçaları arasında ham işaretçileri paylaşmaya çalışırken çift bellek temizleme durumu ortaya çıktı — kodun bazı parçaları
deleteyaparken diğerlerini bilgilendirmedi. Sonuç: production ortamında segfault, core dump analizi problemi hemen ortaya çıkardı.
Hikaye
Eski bir projeyi yeni C++ standartlarına taşırken, ham işaretçilerle yazılmış bir kod parçası bırakıldı, yeni sınıflar ise akıllı işaretçilerle çalışıyordu. Kaynakların sahipliğinin geçirilmesinde sorunlar yaşandı: bellek "iki kez" serbest bırakıldı — önce elle, sonra akıllı işaretçilerin yıkıcıları tarafından otomatik olarak.