malloc/free vs new/delete: C ve C++'da Bellek Yönetimi

# malloc/free vs new/delete: C ve C++'da Bellek Yönetimi

Dinamik bellek ayırmanız gerektiğinde C ve C++ size farklı araçlar sunar. malloc/free C'nin klasik yöntemi, new/delete ise C++'ın nesne yönelimli çözümü. İkisi de bellekten yer alır ama şekli ve sonuçları bambaşka.

malloc ham bellek döndürür; türü bilmez. new ise tip dönüşümü yapar ve C++'ta yapıcı (constructor) çağırır. Bir sınıfın dinamik nesnesi oluşturuyorsanız new kullanmalısınız. malloc sadece bellek ayırır, yapıcıyı çalıştırmaz.

1 <iostream>
2 <cstdlib>
3using namespace std;
4
5class Araba {
6public:
7Araba() { cout << "Araba yapıcısı çağrıldı\n"; }
8~Araba() { cout << "Araba yıkıcısı çağrıldı\n"; }
9};
10
11int main() {
12// new ile: yapıcı çağrılır
13Araba* a1 = new Araba();
14delete a1; // yıkıcı çağrılır
15
16// malloc ile: yapıcı çağrılmaz (hata!)
17Araba* a2 = (Araba*)malloc(sizeof(Araba));
18free(a2); // yıkıcı çağrılmaz
19
20return 0;
21}

Çıktı:

1Araba yapıcısı çağrıldı
2Araba yıkıcısı çağrıldı

malloc ile yapıcı hiç çalışmaz; yıkıcı da çalışmaz. Sınıfta dosya tutacağı, bağlantı açılacağı varsa veri kaybı yaşarsınız.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

malloc NULL döndürebilir (başarısızlık). new ise exception fırlatır. malloc sonrası kontrol etmeniz gerekir:

1int* p = (int*)malloc(100 * sizeof(int));
2if (p == NULL) {
3cout << "Bellek ayırılamadı\n";
4}
5free(p);

new ise:

1try {
2int* p = new int[100];
3// kullan
4delete[] p;
5} catch (bad_alloc& e) {
6cout << "Bellek hatası: " << e.what() << endl;
7}

C'de malloc/free kullanın. C++'ta ise new/delete tercih edin; yapıcı-yıkıcı döngüsü sınıf kaynakları için kritiktir. İdeal olarak modern C++'da akıllı işaretçiler (smart pointers) gibi `unique_ptr` veya `shared_ptr` kullanın, bellek sızıntısı riski ortadan kalkar.

1 <memory>
2using namespace std;
3
4int main() {
5unique_ptr<int> p(new int(42));
6cout << *p << endl; // 42
7// p kapsam dışına çıkınca otomatik silinir
8return 0;
9}

Özet: Sınıf nesnesi new/delete. C kodu veya ham veri malloc/free. Ama C++'ta akıllı işaretçiler tercih edin.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz