Menu
Coddy logo textTech

Dinamik Bellek (new/delete)

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

Artık işaretçileri ve referansları anladığınıza göre, onları dinamik bellek ayırma ile işe koşalım. new ve delete operatörleri, çalışma zamanında yığında (heap) nesneler oluşturmanıza ve yok etmenize olanak tanır.

Bellek ayırmak ve buna işaret eden bir işaretçi almak için new kullanın:

int* num = new int;        // Tek bir tamsayı ayır
*num = 42;                 // İşaretçi aracılığıyla değer ata

Player* player = new Player("Hero");  // Nesne ayır

Belleği serbest bırakmak için her new ifadesinin eşleşen bir delete ifadesi olmalıdır:

delete num;      // Tek bir nesneyi serbest bırak
delete player;   // Yıkıcıyı çağırır, ardından belleği serbest bırakır

Diziler için new[] ve delete[] kullanın:

int* scores = new int[5];    // 5 tam sayıdan oluşan dizi tahsis et
scores[0] = 100;

delete[] scores;             // Diziyi serbest bırak - köşeli parantezlere dikkat edin!

Kaçınılması gereken yaygın hatalar:

// Bellek sızıntısı - silmeyi unuttunuz
int* ptr = new int(10);
ptr = new int(20);    // İlk tahsise erişim kaybedildi!

// Sarkan işaretçi (Dangling pointer) - sildikten sonra kullanma
delete ptr;
*ptr = 5;             // Tanımsız davranış!

// Uyumsuz silme
int* arr = new int[10];
delete arr;           // Yanlış! delete[] olmalı

Sildikten sonra, yanlışlıkla yeniden kullanımı önlemek için işaretçileri nullptr olarak ayarlayın. Manuel bellek yönetimi hataya açıktır; bu nedenle modern C++, bir sonraki adımda inceleyeceğimiz akıllı işaretçileri tercih eder.

challenge icon

Görev

Kolay

new ve delete ile dinamik bellek ayırmayı gösteren basit bir mesaj depolama sistemi oluşturalım.

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

  • MessageBox.h: Bir mesaj dizisini dinamik olarak yöneten bir MessageBox sınıfı tanımlayın. Sınıf şunlara sahip olmalıdır:
    • Dinamik olarak ayrılmış bir dizge dizisine yönelik özel bir işaretçi
    • Mevcut mesaj sayısını izleyen özel bir tamsayı
    • Maksimum kapasiteyi tutan özel bir tamsayı
    • Bir kapasite alan ve diziyi new[] kullanarak ayıran bir kurucu
    • Belleği delete[] kullanarak düzgün şekilde serbest bırakan ve "MessageBox destroyed" yazdıran bir yıkıcı
    • Yer varsa bir mesaj ekleyen, başarılı olduğunda addMessage(string msg) veya kapasite doluysa true döndüren bir false yöntemi
    • Depolanan her mesajı kendi satırında yazdıran bir printAll() yöntemi
  • main.cpp: Girdiden bir kapasite değeri ve mesaj sayısı okuyun. Ardından bu kadar mesaj dizgesini okuyun. Öbekte MessageBox kullanarak bir new oluşturun, tüm mesajları buna ekleyin, printAll() çağrısını yapın ve ardından belleği serbest bırakmak için MessageBox'ı düzgün şekilde silin.

Girdi biçimi şöyle olacaktır:

  • İlk satır: kapasite (tamsayı)
  • İkinci satır: eklenecek mesaj sayısı (tamsayı)
  • Sonraki satırlar: satır başına bir mesaj

Unutmayın: her new için eşleşen bir delete ve her new[] için eşleşen bir delete[] gerekir. Sildikten sonra işaretçileri nullptr olarak ayarlamak iyi bir uygulamadır.

Başlık dosyanızı main.cpp içine #include "MessageBox.h" kullanarak ekleyin.

Kendin dene

#include <iostream>
#include <string>
#include "MessageBox.h"
using namespace std;

int main() {
    int capacity;
    int numMessages;
    
    // Kapasiteyi ve mesaj sayısını oku
    cin >> capacity;
    cin >> numMessages;
    cin.ignore(); // Sayıdan sonraki yeni satır karakterini temizle
    
    // TODO: new kullanarak heap üzerinde bir MessageBox oluştur
    
    // TODO: Tüm mesajları oku ve MessageBox'a ekle
    for (int i = 0; i < numMessages; i++) {
        string message;
        getline(cin, message);
        // Mesajı MessageBox'a ekle
    }
    
    // TODO: Tüm mesajları görüntülemek için printAll() fonksiyonunu çağır
    
    // TODO: Belleği boşaltmak için MessageBox'ı sil
    // Sildikten sonra işaretçiyi nullptr olarak ayarlamayı unutma
    
    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