New / delete ve malloc / free arasındaki fark nedir?


Yanıtlar:


466

Yeni / silme

  • Belleği ayır / serbest bırak
    1. 'Ücretsiz Mağaza'dan ayrılan bellek
    2. Tam yazılan bir işaretçiyi döndürür.
    3. yeni (standart sürüm) hiçbir zaman NULL döndürmez (başarısızlığa neden olur)
    4. Type-ID ile çağrılır (derleyici boyutu hesaplar)
    5. Dizileri işlemek için açıkça bir sürümü vardır.
    6. Yeniden konumlandırma (daha fazla yer elde etmek için) sezgisel olarak işlenmedi (kopya oluşturucu nedeniyle).
    7. Malloc / free adını verip vermedikleri uygulama tanımlanmıştır.
    8. Düşük bellekle başa çıkmak için yeni bir bellek ayırıcı ekleyebilir (set_new_handler)
    9. operatör new / delete yasal olarak geçersiz kılınabilir
    10. nesneyi başlatmak / yok etmek için kullanılan yapıcı / yıkıcı

malloc / ücretsiz

  • Belleği ayırır / serbest bırakır
    1. 'Yığın'dan ayrılan bellek
    2. Bir boşluk döndürür *
    3. Hata durumunda NULL döndürür
    4. Bayt cinsinden gereken boyutu belirtmelidir.
    5. Dizinin ayrılması, alanın manuel olarak hesaplanmasını gerektirir.
    6. Daha büyük bellek yığınını yeniden tahsis etme (Endişelenecek kopya oluşturucu yok)
    7. Onlar olacak DEĞİL yeni çağrı / silme
    8. Hafızanın azalmasına yardımcı olmak için kullanıcı kodunu ayırma sırasına eklemenin bir yolu yoktur.
    9. olabilir malloc / ücretsiz DEĞİL yasal geçersiz kılınan olmak

Özelliklerin tablo karşılaştırması:

 Feature                  | new/delete                     | malloc/free                   
--------------------------+--------------------------------+-------------------------------
 Memory allocated from    | 'Free Store'                   | 'Heap'                        
 Returns                  | Fully typed pointer            | void*                         
 On failure               | Throws (never returns NULL)    | Returns NULL                  
 Required size            | Calculated by compiler         | Must be specified in bytes    
 Handling arrays          | Has an explicit version        | Requires manual calculations  
 Reallocating             | Not handled intuitively        | Simple (no copy constructor)  
 Call of reverse          | Implementation defined         | No                            
 Low memory cases         | Can add a new memory allocator | Not handled by user code      
 Overridable              | Yes                            | No                            
 Use of (con-)/destructor | Yes                            | No                            

Teknik olarak yeni tarafından ayrılan bellek 'Serbest Mağaza'dan, malloc tarafından ayrılan bellek' Yığın'dan gelir. Bu iki alanın aynı olup olmadığı bir uygulama detayıdır, bu da malloc ve yeninin karıştırılamamasının bir başka nedenidir.


12
Birisi öbek yerine "Serbest Mağaza" hakkında ayrıntılı olarak düzenlemek için düzenleyebilir miyim? Bir süreç yığını, iyi bilinen bir dilden bağımsız (?) İşletim sistemi düzeyinde bir kavramdır; "Free Store" nereden geliyor?
einpoklum

1
@ einpoklum: Bunlar sadece hafıza alanlarının isimleri. Ne "yığın" olarak bilinen dil kavramı ya da "süreçler yığını" os kavramı ile ilgisi yoktur. C ++ kasıtlı olarak Platform / OS / Derleyici nötr olarak tanımlanmıştır. Bu nedenle, "işlemler yığını" gibi belirli bir işletim sistemi konseptinin kullanılması, standardın esnekliğini zayıflatır.
Martin York

4
@winterlight: Bu eskiden doğruydu ama artık değil. Bkz: linux.die.net/man/3/free If ptr is NULL, no operation is performed.
Martin York

2
@LokiAstari 'Öbek', 'serbest mağaza' ve 'dinamik bellek / depolama' gibi eşanlamlılar: Bjarne Stroustrup'un C ++ Turu'nda, " newOperatör boş mağazadan bellek ayırıyor ( dinamik bellek olarak da bilinir) ve yığın .) C ++ 14 Standart, bölüm 3.7.4 Dinamik Depolama "Nesneler yeni ifadeleri (5.3.4) kullanılarak, program yürütme (1.9) sırasında dinamik olarak oluşturulabilir ve silme-ifadeleri kullanarak tahrip." diyor
Max Heiber

2
mheiber: Aynı olabildikleri anlamına geliyor. Ve bazı uygulamalar malloc'u çağırarak yeni uygular (diğer yöne açıkça izin verilmediğine dikkat edin). Ancak bazı uygulamalar bu hafıza alanlarını tamamen ayrı tutar. Onları ayrı tutmanın nedeni, C ++ bellek yönetimi kodunun C bellek yönetiminden farklı bir şekilde optimize edilmesine izin vermesidir. Mesele şu: Aynı olabilirler ama öyle olduklarını varsayamazsınız.
Martin York

81

En ilgili fark, newoperatörün belleği tahsis deleteetmesinden sonra yapıcıyı çağırması ve yıkıcıyı çağırması ve ardından belleği yeniden yerleştirmesidir.


22
Açıkçası, yeni operatör sadece belleği ayırır. Yeni işleci çağıran, ardından yapıcıyı ayrılan bellekte çalıştıran yeni ifadedir.
Don Wakefield

Başka bir fark, belleğin nereye tahsis edildiği. Son zamanlarda, malloc / free öbek üzerinde çalıştığı bir yerde gördüm, yeni / delete ise adı beni şimdi atlayan başka bir bellek alanında çalışıyor. (Bununla birlikte, diğer alanın muhtemelen başka bir yığın olarak düşünülebileceğini söylemek yeterlidir.)
RobH

2
@mgb: Evet, nesnelerin "Uygulama yığını" veya yığına tahsis edildiğinden eminsiniz. Ancak @RobH, standardın "Uygulama Yığını" nın farklı bölümlerini çağırdığından bahsediyor. Malloc'un bellek ayırdığı "Yığın" ve yeni bellek ayırdığı "Serbest Mağaza" vardır. İçinde olsa bazı uygulamalarda bu alanlar örtüşme yapmak (bu bir uygulama ayrıntıdır).
Martin York

1
İfadeniz% 100 doğru, ancak sorulan soruya cevap vermiyor, aşağıdaki cevaba bakın, sizinkinden daha fazla oy almasının bir nedeni var.
Murali

1
Söylemeye çalıştığım tek şey, cevabının eksik olduğu bir karşılaştırma olarak nitelendirilmesi için en azından malloc / free'den bahsetmesi gerektiğiydi. Bununla birlikte, bu ilgili ve doğru bir açıklamadır, bu yüzden upvotes, umarım anladığımı anlarsın. Her neyse, eğer sadece benim aşağı oyumu geri almama izin verirse, gönülden isterim.
Murali

30

newnesnenin deletector'unu çağırır, dtor'u arayın.

malloc& freesadece ham belleği ayırıp serbest bırakın.


Ham hafıza ile ne demek istiyorsun?
Yıkıcı

3
Ham hafızaya hiçbir şey yapılmadı. Henüz hiçbir nesne inşa edilmedi, içine hiçbir şey kopyalanmadı ve çoğu durumda önceki içeriğin üzerine yazılmadı.
James Curran

14

new/ deleteC ++, malloc/ freeiyi eski C'den geliyor.

C ++ 'da newbir nesne yapıcısını deleteçağırır ve yıkıcıyı çağırır.

mallocve freeOO'dan önceki karanlık çağlardan itibaren, nesnenin herhangi bir kodunu yürütmeden sadece belleği tahsis eder ve boşaltır.


9
"OO'dan önce karanlık çağlardan geliyor", gerçekte yeni / silme malloc / free'den daha iyi olduğunu ima ediyor gibi görünüyor , ne daha iyi ne de daha kötü, sadece farklı kullanımları var. Unutmayın, sizi reddeden şey değilim, sadece tahmin ediyorum.
Graeme Perrow

13

C ++ new/ deletebuna göre yapıcı / yıkıcı arayın.

malloc/ freeyığıntan bellek ayırmanız yeterlidir. new/ deletebellek ayırma.


10

Tek benzerlikler malloc/ newher ikisi de öbek üzerindeki bazı bellek adreslerini gösteren bir işaretçi döndürür ve her ikisi de, böyle bir bellek bloğu döndürüldüğünde, ilk önce serbest / silmediğiniz sürece tekrar döndürülmeyeceğini garanti eder. Yani her ikisi de hafızayı "ayırır".

Bununla birlikte, new/ deleteyapıcılar, yıkıcılar ve operatörler ile, ilave olarak isteğe bağlı başka bir iş yerine getirir. malloc/ freeSadece hiç ayırmak ve boş bellek.

Aslında, newbelleği yığıntan geri döndürmemesi veya hatta hiç bellek ayırmaması için yeterince özelleştirilebilir. Ancak varsayılan new.


7

New ve malloc arasındaki temel fark, yeni nesnenin yapıcısını çağırır ve karşılık gelen silme çağrısı, nesnenin yıkıcısını çağırır.

Başka farklılıklar da var:

  • newtür güvenlidir, malloctürdeki nesneleri döndürürvoid*

  • newhataya bir istisna atar, mallocdöner NULLve errno ayarlar

  • newbir operatördür ve aşırı yüklenebilir, mallocbir işlevdir ve aşırı yüklenemez

  • new[], dizileri ayıran, sezgisel ve türden daha güvenli malloc

  • malloc-deriveren ayırmalar yeniden boyutlandırılabilir realloc, new-deriverilen ayırmalar yeniden boyutlandırılamaz

  • mallocN-bayt bellek yığınını ayırabilir new, örneğin, bir dizi chartür ayırması istenmelidir

Farklılıklara bakıldığında, bir özet malloc C-esque, yeni C ++-esque. Kod tabanınız için doğru olanı kullanın.

Her ne kadar yeni ve malloc'un farklı bellek ayırma algoritmaları kullanılarak uygulanması yasal olsa da, çoğu sistemde yeni sistemde dahili olarak malloc kullanılarak uygulanır ve sistem düzeyinde fark olmaz.


5

Bunu newyapmayan birkaç şey var malloc:

  1. new nesnenin yapıcısını çağırarak nesneyi oluşturur
  2. new ayrılan belleğin tiplendirilmesini gerektirmez.
  3. Bir miktar bellek tahsis edilmesini gerektirmez, bunun yerine bir dizi nesnenin inşa edilmesini gerektirir.

Yani, kullanırsanız malloc, o zaman yukarıdaki şeyleri açıkça yapmanız gerekir, ki bu her zaman pratik değildir. Ayrıca, newaşırı yüklenebilir ancak mallocolamaz.

Tek kelimeyle, C ++ kullanıyorsanız new, mümkün olduğunca kullanmaya çalışın .


4

Ayrıca,

küresel yeni ve silme geçersiz kılınabilir, malloc / free yapılamaz.

daha fazla yeni ve silme her tip için geçersiz kılınabilir.


3

newve bir sınıfın yeni bir örneğini bildiren veya silen (böylece örnek için sınıfın yıkıcısını çağıran) deleteC ++ temel öğeleridir.

mallocve freeC fonksiyonlarıdır ve bellek bloklarını tahsis eder ve serbest bırakırlar (boyut olarak).

Her ikisi de ayırmayı yapmak için öbeği kullanır. mallocve freeyine de sadece bir göstergeyle ilişkilendirilecek bir bellek alanı ayırdığı için daha "düşük seviye" dir. Bu bellek etrafında hiçbir yapı oluşturulmaz (bir C dizisinin bir yapı olduğunu düşünmüyorsanız).


1
C ++ 'ta yeni bir sınıf örneği bildirmez. (Genellikle) öbekten bir tane tahsis eder ve hiçbir şey beyan etmez. Bir örneği yalnızca bildirerek bildirebilirsiniz; bu durumda, bildirimin saklama süresine bağlı olarak yığında veya global olarak olur.
Steve Jessop

Sınıf için bellek alanı ayırır, ancak sınıfın yığına depolanması anlamında değil, yığında bir sınıf "bildiremezsiniz". Beyan sadece sınıfın bulunduğu gerçek bellek yığınında olan her zaman yığına atanan sınıfa işaretçi içerir.
Jorge Córdoba

Evet yapabilirsin. Soru etiketlerine göre bu C ++, böylece nesneler yığının üzerine gidebilir. Ve yeni bir beyan değil, bir ifade. Bir şeyi bildirmek ve tahsis etmek ayrı şeylerdir.
Steve Jessop

2

new ve delete c ++ 'daki operatörlerdir; bu da aşırı yüklenebilir. malloc ve free c fonksiyonudur;

malloc yeni istisna atarken başarısız olduğunda null ptr değerini döndürür.

malloc tarafından döndürülen adresin, (void *) malloc (size) döndürdüğü için tekrar türüne göre yapılması gerekir. Yeni yazılan işaretçiyi döndürür.


2
  • yeni bir operatör iken malloc () bir işlevdir.
  • new tam veri türünü, malloc () ise void * (void türünün göstergesini) döndürür.
  • malloc (), bellek başlatılmaz ve varsayılan değer çöptür, yeni durumlarda bellek int durumunda 'sıfır (0)' gibi varsayılan değerle başlatılır.
  • delete ve free () her ikisi de 'NULL' işaretçileri için kullanılabilir.

0
  • Kullanmak için malloc(), gerekli olmayan veya programa dahil etmemiz gerekir .<stdlib.h><alloc.h>new
  • newve deleteaşırı yüklenebilir ama mallocolamaz.
  • Yerleşimi kullanarak, newbellek ayırmak istediğimiz adresi iletebiliriz, ancak bu mümkün değildir malloc.

1
alloc.hstandart bir başlık değil. <new>yerleşimi yeni kullanmak için gereklidir.
MM

0

Anahtar kelimeyi veya serbest fonksiyonu silmek için bu kod. Ancak 'malloc' veya 'new' kullanarak bir işaretçi nesnesi oluşturduğunuzda ve bu nesne işaretçisi bile delete kullanarak nesne belleğini yeniden tahsis ederken sınıftaki çağrı işlevi olabilir. Bu kullanımdan sonra delete yerine free kullanın, sonra free ifadesinden sonra da çalışır, ancak her ikisini de kullandığınızda sadece pointer nesnesi sınıfta işlev göremez. Kod aşağıdaki gibidir:

#include<iostream>


using namespace std;

class ABC{
public: ABC(){
    cout<<"Hello"<<endl;
  }

  void disp(){
    cout<<"Hi\n";
  }

};

int main(){

ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();

cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}

çıktı :

Hello
Hi
0x2abfef37cc20

-3

1. yeni syntex malloc'dan () daha basittir

2.new/delete, malloc () / free () işlevinin bulunduğu bir operatördür.

Derleyici tarafından doğrudan yapıştırılan yeni asıl kod çünkü 3.new/delete malloc () / free () 'den daha hızlı çalıştır.

4. operatör üst üste binme yardımı ile programdaki yeni / silme anlamını değiştirebiliriz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.