make_unique ve make_shared
- C++ kursu
- Orta seviye
- Ders 85/116
- 5 dk
make_unique ve make_shared ile güvenli oluşturma öğrenirsin.
make_unique ve make_shared
std::make_unique ve std::make_shared akıllı işaretçi oluşturmanın güvenli yoludur. new kullanmak yerine bunları kullanırsın: auto p = std::make_unique<int>(42); veya auto p = std::make_shared<int>(42);.
Bu fonksiyonlar istisna güvenliği (exception safety) sağlar. std::unique_ptr<int> p(new int(42)) yazmak yerine make_unique kullanmak, olası bir istisna durumunda bellek sızıntısını önler. Ayrıca make_shared nesne ve referans sayacını tek blokta ayırır; bu daha verimlidir. Modern C++'ta new doğrudan kullanmaktan kaçınılır; make_* fonksiyonları tercih edilir.
Verimlilik ve güvenlik
make_shared nesne ve kontrol bloğunu (referans sayacı) tek bellek bloğunda ayırır. Bu, iki ayrı new çağrısına göre daha verimlidir; hem bellek hem hız kazanımı sağlar.
make_unique ise new ile aynı maliyete sahiptir ama istisna güvenliği sağlar. Örnek: bir fonksiyon f(std::unique_ptr<int>(new int(42)), g()) çağrısında g() istisna fırlatırsa new int(42) sızdırılır. f(std::make_unique<int>(42), g()) kullanırsan bu risk yoktur. Bu yüzden make_* her zaman tercih edilir.
Uygulama make_unique ve make_shared kullan
auto p1 = std::make_unique<int>(7); ile bir unique_ptr ve auto p2 = std::make_shared<int>(14); ile bir shared_ptr oluştur. İki değeri de std::cout ile boşlukla yazdır: *p1 ve *p2.
Başlangıç kodu
#include <iostream>
#include <memory>
int main() {
// make_unique ve make_shared ile oluştur, değerleri yazdır
return 0;
}Örnek çözüm
#include <iostream>
#include <memory>
int main() {
auto p1 = std::make_unique<int>(7);
auto p2 = std::make_shared<int>(14);
std::cout << *p1 << " " << *p2;
return 0;
}Beklenen çıktı
7 14
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 make_unique çağrısını tamamla
auto p = std::____<int>(42);
auto p = std::make_unique<int>(42);
Açıklama: make_unique güvenli unique_ptr oluşturur.
2 make_unique, new'e göre ne avantaj sağlar?
// bu iki kullanim ayni sonucu verir ama
// make_unique daha guvenli- Daha az bellek kullanır
- Daha hızlı çalışır
- İstisna güvenliği sağlar Doğru cevap
- Daha büyük nesne oluşturur
Açıklama: make_unique istisna durumunda bellek sızıntısını önler.
3 Fonksiyonu amacıyla eşle
| Kavram | Anlamı |
|---|---|
std::make_unique |
Tek sahip güvenli |
std::make_shared |
Paylaşılan güvenli |
new int(42) |
Doğrudan ayırma |
Tek bellek bloğu |
make_shared avantajı |