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#include <iostream>2#include <cstdlib>3using namespace std;45class 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};1011int main() {12// new ile: yapıcı çağrılır13Araba* a1 = new Araba();14delete a1; // yıkıcı çağrılır1516// malloc ile: yapıcı çağrılmaz (hata!)17Araba* a2 = (Araba*)malloc(sizeof(Araba));18free(a2); // yıkıcı çağrılmaz1920return 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.
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// kullan4delete[] 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#include <memory>2using namespace std;34int main() {5unique_ptr<int> p(new int(42));6cout << *p << endl; // 427// p kapsam dışına çıkınca otomatik silinir8return 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.
0 yorum