new
/ delete
Ve malloc
/ arasındaki fark nedir free
?
İlgili (yinelenen?): Hangi durumlarda malloc vs new kullanıyorum?
new
/ delete
Ve 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.
new
Operatö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, new
operatörün belleği tahsis delete
etmesinden sonra yapıcıyı çağırması ve yıkıcıyı çağırması ve ardından belleği yeniden yerleştirmesidir.
new
nesnenin delete
ctor'unu çağırır, dtor'u arayın.
malloc
& free
sadece ham belleği ayırıp serbest bırakın.
new
/ delete
C ++, malloc
/ free
iyi eski C'den geliyor.
C ++ 'da new
bir nesne yapıcısını delete
çağırır ve yıkıcıyı çağırır.
malloc
ve free
OO'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
/ new
her 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
/ delete
yapıcılar, yıkıcılar ve operatörler ile, ilave olarak isteğe bağlı başka bir iş yerine getirir. malloc
/ free
Sadece hiç ayırmak ve boş bellek.
Aslında, new
belleğ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:
new
tür güvenlidir, malloc
türdeki nesneleri döndürürvoid*
new
hataya bir istisna atar, malloc
döner NULL
ve errno ayarlar
new
bir operatördür ve aşırı yüklenebilir, malloc
bir 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
malloc
N-bayt bellek yığınını ayırabilir new
, örneğin, bir dizi char
tü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 new
yapmayan 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, new
aşırı yüklenebilir ancak malloc
olamaz.
Tek kelimeyle, C ++ kullanıyorsanız new
, mümkün olduğunca kullanmaya çalışın .
new
ve 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) delete
C ++ temel öğeleridir.
malloc
ve free
C 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. malloc
ve free
yine 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>
new
new
ve delete
aşırı yüklenebilir ama malloc
olamaz.new
bellek ayırmak istediğimiz adresi iletebiliriz, ancak bu mümkün değildir malloc
.alloc.h
standart 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.