Menu
Coddy logo textTech

C++'ta Akıllı İşaretçiler

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 15 / 104.

Akıllı işaretçiler, yığın belleğini sizin için otomatik olarak yöneten sarmalayıcı sınıflardır. İşaretçi kapsam dışına çıktığında belleği temizleyerek manuel delete çağrıları yapma gereğini ortadan kaldırırlar.

Akıllı işaretçileri kullanmak için <memory> başlığını dahil edin.

unique_ptr - özel sahiplik. Bir seferde kaynağın sahibi yalnızca bir işaretçi olabilir.

#include <memory>

std::unique_ptr<Player> player = std::make_unique<Player>("Hero");
player->attack();  // Normal bir işaretçi gibi kullanın

// Kopyalanamaz, ancak sahiplik devredilebilir
std::unique_ptr<Player> player2 = std::move(player);
// player artık nullptr'dir

shared_ptr - paylaşımlı sahiplik. Birden çok işaretçi aynı kaynağa sahip olabilir. Bellek, son sahip yok edildiğinde serbest bırakılır.

std::shared_ptr<Player> p1 = std::make_shared<Player>("Hero");
std::shared_ptr<Player> p2 = p1;  // Her ikisi de kaynağa sahiptir

std::cout << p1.use_count();  // 2 yazdırır

weak_ptr - bir shared_ptr’ın sahiplik taşımayan gözlemcisi. Döngüsel başvuruları kırmak için kullanışlıdır.

std::shared_ptr<Player> shared = std::make_shared<Player>("Hero");
std::weak_ptr<Player> weak = shared;

if (auto locked = weak.lock()) {  // shared_ptr'a dönüştür
    locked->attack();
}

Tekil sahiplik için varsayılan olarak unique_ptr kullanın. Birden fazla nesnenin bir kaynağı paylaşması gerektiğinde shared_ptr kullanın. Yaşam süresini uzatmadan gözlemlemek için weak_ptr kullanın.

Ham new yerine make_unique ve make_shared kullanmayı tercih edin.

challenge icon

Görev

Kolay

Akıllı işaretçilerin farklı sahiplik modellerini gösteren bir belge paylaşım sistemi oluşturalım. unique_ptr'nin özel sahipliği nasıl zorunlu kıldığını, shared_ptr'nin birden çok sahibin olmasına nasıl izin verdiğini ve weak_ptr'nin yaşam süresini etkilemeden nasıl gözlemleyebildiğini göreceksin.

Kodunu düzenlemek için iki dosya oluşturacaksın:

  • Document.h: Paylaşılabilir bir belgeyi temsil eden bir Document sınıfı tanımla. Şunlara sahip olmalı:
    • Özel bir title özniteliği (string)
    • Bir başlık alan ve "Document created: <title>" yazdıran bir kurucu
    • "Document deleted: <title>" yazdıran bir yıkıcı
    • Başlığı döndüren bir getTitle() yöntemi
  • main.cpp: Girdiden bir belge başlığı okuyarak üç akıllı işaretçi türünün tümünü göster, ardından:
    • Girdi başlığına sahip bir Document için bir unique_ptr oluştur
    • "Unique owner: <title>" yazdır
    • unique_ptr kullanarak sahipliği başka bir std::move'ye aktar
    • "Ownership transferred" yazdır
    • shared_ptr başlığına sahip yeni bir Document için bir "SharedDoc" oluştur
    • Aynı belgeyi gösteren ikinci bir shared_ptr oluştur
    • "Shared owners: <count>" kullanarak use_count() yazdır
    • Paylaşılan işaretçilerden birinden bir weak_ptr oluştur
    • Belgeye zayıf işaretçi üzerinden erişmek için lock() kullan ve "Weak access: <title>" yazdır

Akıllı işaretçiler için <memory> eklemeyi unutma. Akıllı işaretçilerini oluşturmak için std::make_unique ve std::make_shared kullan. Yıkıcı mesajları, her belgenin programın sonunda ne zaman otomatik olarak temizlendiğini görmene yardımcı olacak.

Başlık dosyanı main.cpp içine #include "Document.h" kullanarak ekle.

Kendin dene

#include <iostream>
#include <memory>
#include <string>
#include "Document.h"

using namespace std;

int main() {
    string inputTitle;
    cin >> inputTitle;

    // TODO: inputTitle ile bir Document için unique_ptr oluşturun
    // std::make_unique kullanarak

    // TODO: "Unique owner: <title>" yazdırın

    // TODO: std::move kullanarak sahipliği başka bir unique_ptr nesnesine devredin

    // TODO: "Ownership transferred" yazdırın

    // TODO: "SharedDoc" başlıklı yeni bir Document için shared_ptr oluşturun
    // std::make_shared kullanarak

    // TODO: Aynı belgeyi işaret eden ikinci bir shared_ptr oluşturun

    // TODO: use_count() kullanarak "Shared owners: <count>" yazdırın

    // TODO: Paylaşılan işaretçilerden birinden bir weak_ptr oluşturun

    // TODO: weak_ptr üzerinden belgeye erişmek için lock() kullanın
    // ve "Weak access: <title>" yazdırın

    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi