ProgramlamaC++ Backend Geliştirici

C++'de bellek kontrol mekanizmalarını açıklayın. `new/delete` ile akıllı işaretçiler arasındaki fark nedir ve neden akıllı işaretçilerin kullanılması tercih edilmelidir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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.

Kandırmaca soru.

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;

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


Hikaye

Büyük bir C++ projesinde, bir geliştirici dinamik belleği manuel olarak delete ile 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ı delete yaparken 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.