Middle
C++'ta unique_ptr nasıl çalışır?
sobes.tech yapay zeka
AI'dan gelen yanıt
std::unique_ptr — dinamik olarak tahsis edilen nesne üzerinde münhasır sahipliği uygulayan akıllı bir göstergedir. Otomatik bellek yönetimi sağlar: unique_ptr tarafından işaret edilen nesne, unique_ptr yok edildiğinde otomatik olarak silinir.
Ana özellikler:
- Münhasır sahiplik: Her zaman, yalnızca bir
unique_ptrbelirli bir nesneyi sahip olabilir. - Kopyalama yok:
unique_ptrkopyalanamaz. Bu, çoklu sahipliği ve "çift silme" sorununu önler. - Taşıma semantiği: Nesne sahipliği, taşıma semantiği (
std::move) kullanılarak birunique_ptr'den diğerine aktarılabilir. - Yapılandırılabilir silici: Kaynakların serbest bırakılma biçimlerini yönetmek için kendi silicinizi sağlayabilirsiniz.
Çalışma prensibi RAII (Resource Acquisition Is Initialization) ilkesine dayanır: kaynak (dinamik olarak tahsis edilen bellek), nesne oluşturulurken edinilir (unique_ptr) ve yok edilirken serbest bırakılır.
#include <memory> // unique_ptr için
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass oluşturuldu\n"; }
~MyClass() { std::cout << "MyClass yok edildi\n"; }
};
int main() {
{
// MyClass nesnesini sahipleyen bir unique_ptr oluşturma
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// Bu noktada, ptr1 nesnenin münhasır sahibidir
// auto ptr2 = ptr1; // Derleme hatası: kopyalama engellenmiş
// Sahipliği ptr1'den ptr2'ye taşıma
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Taşıma sonrası, ptr1 artık nesneye sahip değil (nullptr oldu)
if (!ptr1) {
std::cout << "ptr1 nesneye sahip değil: " << (ptr1 ? "Evet" : "Hayır") << "\n";
}
// ptr2'nin kapsamı burada sona erer.
// ptr2 yok edilir ve sahip olduğu MyClass nesnesi otomatik olarak silinir.
} // MyClass nesnesi burada yok edilir
std::cout << "main sonu.\n";
return 0;
}
Raw pointer ile karşılaştırma:
| Özellik | raw pointer |
std::unique_ptr |
|---|---|---|
| Kaynak sahipliği | Belirlenmemiş | Münhasır |
| Otomatik silme | Hayır | Evet |
| Kopyalama semantiği | Evet | Hayır (sadece taşıma) |
| Bellek sızıntısı riski | Yüksek | Düşük |
Genel olarak, unique_ptr, C++11 ve sonrası sürümlerde, katı sahiplik ve otomatik kaynak serbest bırakma gerektiren durumlar için tercih edilen bellek yönetim yöntemidir.