CodeBlanks Logo Icon CodeBlanks

make_unique ve make_shared

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

main.cpp
#include <iostream>
#include <memory>

int main() {
    // make_unique ve make_shared ile oluştur, değerleri yazdır
    return 0;
}

Örnek çözüm

main.cpp
#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

Soru
auto p = std::____<int>(42);
Cevap
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?

main.cpp
// 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ı

Orta seviye bölümündeki tüm dersler