new/ deleteVe malloc/ arasındaki fark nedir free?
İlgili (yinelenen?): Hangi durumlarda malloc vs new kullanıyorum?
new/ deleteVe malloc/ arasındaki fark nedir free?
İlgili (yinelenen?): Hangi durumlarda malloc vs new kullanıyorum?
Yanıtlar:
Ö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.
If ptr is NULL, no operation is performed.
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
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.
newnesnenin deletector'unu çağırır, dtor'u arayın.
malloc& freesadece ham belleği ayırıp serbest bırakın.
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.
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.
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.
Bunu newyapmayan birkaç şey var malloc:
new nesnenin yapıcısını çağırarak nesneyi oluştururnew ayrılan belleğin tiplendirilmesini gerektirmez.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 .
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).
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.
malloc(), gerekli olmayan veya
programa dahil etmemiz gerekir .<stdlib.h><alloc.h>newnewve deleteaşırı yüklenebilir ama mallocolamaz.newbellek ayırmak istediğimiz adresi iletebiliriz, ancak bu mümkün değildir malloc.alloc.hstandart bir başlık değil. <new>yerleşimi yeni kullanmak için gereklidir.
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
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.