New ve malloc Arasındaki Fark ()

Yazar: Laura McKinney
Yaratılış Tarihi: 1 Nisan 2021
Güncelleme Tarihi: 5 Mayıs Ayı 2024
Anonim
SoruCevap 26 Ekim 2015 - Dinamik Hafıza (Dynamic Memory)
Video: SoruCevap 26 Ekim 2015 - Dinamik Hafıza (Dynamic Memory)

İçerik


New ve malloc () her ikisi de belleği dinamik olarak ayırmak için kullanılır. Buna rağmen, new ve malloc () birçok eksilerde farklıdır. New ve malloc () arasındaki temel fark şudur: yeni yapı olarak kullanılan operatördür. Öte yandan, Malloc () çalışma zamanında bellek ayırmak için kullanılan standart bir kütüphane işlevidir. Aralarındaki diğer farklılıklar karşılaştırma tablosunda aşağıda tartışılmıştır:

  1. Karşılaştırma Tablosu
  2. Tanım
  3. Anahtar Farklılıklar
  4. Sonuç

Karşılaştırma Tablosu

Karşılaştırma için temelyenimalloc ()
DilYeni işleç, C ++, Java ve C # gibi belirli bir özelliktir. Malloc () işlevi C'nin bir özelliğidir.
Doğa"yeni" bir operatördür.malloc () bir fonksiyondur.
boyutu( )Yeni belirli tür için işleç asit ayırıcı yeterli bellek ayırmak gerekmez malloc, hangi bellek boyutunun ayrılması gerektiğini bilmek için operatörün boyutunu gerektirir.
inşaatçı Yeni Operatör bir nesnenin yapıcısını çağırabilir.malloc (), bir kurucu için arama yapamaz.
BaşlatmaYeni işleç, kendisine bir bellek tahsis ederken bir nesneyi başlatabilir.Malloc'ta hafıza başlatma işlemi yapılamadı.
fazla yükleme Operatör yeni aşırı yüklenebilir.Malloc () asla aşırı yüklenemez.
başarısızlıkBaşarısızlık durumunda, operatör yeni bir istisna atar.Hata durumunda, malloc () bir NULL döndürür.
DeallocationYeni bellek ayırma işlemi, "delete" ile iptal edildi.Malloc () tarafından yapılan hafıza tahsisi bir free () işlevi kullanılarak serbest bırakılır.
Yeniden tahsisYeni operatör hafızayı yeniden tahsis etmiyor.Malloc () tarafından ayrılan hafıza, realloc () kullanılarak yeniden tahsis edilebilir.
infazYeni operatör çalıştırma süresini kısaltır.Malloc () yürütmek için daha fazla zaman gerektirir.


Yeni tanımı

Operatör yeni dinamik olarak bellek ayıran bir bellek ayırma operatörüdür. Yeni işleç öbekte bellek ayırır ve referans değişkene atanmış olan belleğin başlangıç ​​adresini döndürür. Yeni operatör C'deki malloc'a () benzer. Ancak, C ++ derleyicisi malloc () ile uyumludur, ancak malloc () 'a göre belirli avantajlara sahip olduğu için yeni operatörü kullanmak en iyisidir. Yeni operatörün sözdizimi aşağıdaki gibidir:

type değişken_ismi = yeni tip (parametre_listesi);

Burada “tip”, belleğin tahsis edilmesi gereken değişken veri tipini belirtir. "Değişken_adı" sözcüğü, işaretçiyi belleğe tutan başvuru değişkenine verilen addır. Buradaki parantez, yapıcının çağrılmasını belirtir. Parametre_listesi, yeni inşa edilen nesneyi başlatmak için yapıcıya iletilen değerlerin listesidir.


Yeni işleç, belirli bir türdeki bir nesne için gereken yeterli belleği ayırır. Bu nedenle, bir sizeof () operatörü gerektirmez ve belleği yeniden tahsis etmek için realloc () kullanan malloc () gibi belleği yeniden boyutlandırmayı gerektirmez. Yeni operatör bir yapıdır; nesneyi genellikle başlatmak için kullanılan bildirimde bulunurken bir nesnenin yapıcısını çağırır.

Yeni operatörün hafızayı yığına tahsis ettiğini ve yığının boyutunun sınırlı olduğunu biliyoruz. Öyleyse, yığın bellek yetersizse ve yeni operatör belleği ayırmaya çalışırsa, yeni operatörün başarısız olmasına neden olur. Yeni operatör hafızayı tahsis edemezse, bir istisna atar ve kodunuz bu istisnayı idare edemiyorsa, program anormal biçimde sonlandırılır.

Operatör tarafından ayrılan hafıza, silme operatörü kullanılarak serbest bırakılabilir. Yeni operatör, bir fonksiyonu değil, bir operatörü olduğu için yürütme süresini kısaltır.

Malloc'un tanımı ()

Malloc () İstenilen bellek miktarını öbek üzerine tahsis etmek için kullanılan bir işlevdir. Bu yöntem daha sonra belirtilmiş olan “void” türünü döndürür, belirtilen türdeki bir belleğe bir işaretçi getirmek için cast yazın ve bu işaretçi bir referans değişkenine belleğe atanır. Malloc () işlevi, belleği dinamik olarak ayırmak için kullanıldığı için C ++ 'daki yeni operatöre benzer. Malloc () standart bir kütüphane işlevidir. Malloc () işlevinin sözdizimi aşağıdaki gibidir:

type değişken_adı = (tür *) malloc (sizeof (tür));

Burada “tip”, belleğin tahsis edilmesi gereken değişken veri tipini gösterir. Değişken_adı, malloc () tarafından döndürülen işaretçinin atanacağı referans değişkeninin adıdır. (Tür *), belirli bir türdeki belleğe bir işaretçi elde etmek için tür dökümünü açıklar. Sizeof (), hangi bellek boyutunun gerekli olduğunu malloc () işlevini açıklar.

Malloc (), tip dökümünü gerektirir; çünkü malloc () tarafından döndürülen işaretçi, geçersiz türdendir, bu nedenle, işaretçiye bir tür atamak için, tür dökümü gerekir. Malloc () işlevi bir ham bellek tahsis ettiği için sizeof () işlevi gereklidir, bu nedenle malloc () işlevine hangi bellek boyutunu ayırması gerektiğini söylemek gerekir. Atanan hafıza yeterli değilse, realloc () kullanılarak yeniden boyutlandırılabilir veya yeniden tahsis edilebilir.

Malloc () işlevi öbek üzerinde bellek ayırır. Öbek, bellekte yetersiz kaldığında, malloc () işlevi bir NULL işaretçisi döndürür. Bu nedenle, malloc () tarafından döndürülen işaretçiyi içeren referans değişkeni kullanılmadan önce kontrol edilmelidir, aksi halde sistem çökmesine neden olabilir.

Malloc () işlevi tarafından ayrılan hafıza, free () kullanılarak serbest bırakılır. İşlev çağrısı bir ek yüke yol açtığından, malloc () yürütmek için daha fazla zaman gerektirir.

  1. Yeni işleç, C ++ 'da tanıtılan ve Java, C #, vs.'de kullanılan bir yapıdır. Öte yandan malloc (), yalnızca C dilinde bulunan ve C ++ tarafından desteklenen standart bir kütüphane işlevidir.
  2. Yeni işleç, belirli bir türdeki nesne için yeterli bellek ayırır, bu nedenle boyutlandırma işleci gerektirmez. Öte yandan, malloc () işlevi, işlevin hangi bellek boyutunu ayırması gerektiğini bilmesini sağlamak için sizeof () operatörünü gerektirir.
  3. Yeni operatör, bildirim sırasında nesnenin yapıcısını arayabilir. Öte yandan, malloc () işlevi yapıcıyı çağıramaz.
  4. 'Yeni' işleci aşırı yüklenebilir, ancak malloc () olamaz.
  5. Yeni operatör hafızayı tahsis edemezse, kod tarafından kullanılması gereken bir istisna atar, aksi halde program sonlandırılır. Öte yandan, malloc () işlevi, bellek ayıramadığında bir NULL işaretçisi döndürür. İşaretçi bunu kontrol etmeden kullanılırsa, sistem çökmesine neden olur.
  6. Yeni bir operatör kullanılarak ayrılan hafıza, 'sil' kullanılarak ayrılabilir. Öte yandan, malloc () işlevi kullanılarak ayrılan bellek, free () kullanılarak ayrılabilir.
  7. Hafıza yeni bir operatör kullanılarak tahsis edildikten sonra, yine de yeniden boyutlandırılamaz. Diğer yandan, malloc () işlevi kullanılarak ayrılan bellek, realloc () işlevi kullanılarak yeniden tahsis edilebilir (yeniden boyutlandırılabilir).
  8. Yeni yürütme süresi malloc () ile karşılaştırıldığında daha azdır, çünkü malloc bir işlevdir ve yeni bir yapıdır.

Sonuç:

Malloc () işlevi, belleği dinamik olarak ayırmanın eski yoludur. Günümüzde, yeni operatör çalışma zamanında belleği ayırmak için kullanılmaktadır, çünkü malloc () 'a göre bazı avantajları vardır.