Jaka jest różnica między new
/delete
i malloc
/ free
?
Powiązane (duplikat?): W jakich przypadkach używam malloc vs nowy?
c++
memory-management
MrDatabase
źródło
źródło
Odpowiedzi:
nowy / usuń
malloc / za darmo
Tabela porównania funkcji:
Technicznie pamięć przydzielona przez new pochodzi z „Free Store”, a pamięć przydzielona przez malloc pochodzi z „Heap”. To, czy te dwa obszary są takie same, jest szczegółem implementacji, co jest kolejnym powodem, dla którego nie można mieszać malloc i new.
źródło
If ptr is NULL, no operation is performed.
new
Operator przydziela pamięć z bezpłatnej pamięci (znanej również jako pamięć dynamiczna i sterty .) C ++ 14 standard, sekcja 3.7.4 na Dynamic Storage mówi "Przedmioty mogą być tworzone dynamicznie w czasie wykonywania programu (1.9), używając nowego wyrażenia (5.3.4), i zniszczone przy użyciu delete-wyrażeń."Najbardziej istotną różnicą jest to, że
new
operator przydziela pamięć, a następnie wywołuje konstruktor, adelete
następnie wywołuje destruktor, a następnie zwalnia pamięć.źródło
new
wywołuje ctor obiektu,delete
wywołuje dtor.malloc
ifree
po prostu przydziel i zwolnij surową pamięć.źródło
new
/delete
to C ++,malloc
/free
pochodzi ze starego, dobrego C.W C ++
new
wywołuje konstruktor obiektów idelete
wywołuje destruktor.malloc
ifree
, pochodząc z epoki ciemności przed OO, przydzielaj i zwalniaj pamięć, nie wykonując żadnego kodu obiektu.źródło
W C ++
new
/delete
wywołaj odpowiednio Constructor / Destructor.malloc
/free
po prostu przydziel pamięć ze sterty.new
/delete
przydziel także pamięć.źródło
Jedyne podobieństwa polegają na tym, że
malloc
/new
oba zwracają wskaźnik, który adresuje pewną pamięć na stercie, i oba gwarantują, że po zwróceniu takiego bloku pamięci nie zostanie on zwrócony, chyba że najpierw go zwolnisz / usuniesz. Oznacza to, że obie „alokują” pamięć.Jednak
new
/delete
wykonuj dowolne inne prace dodatkowo, poprzez konstruktory, destruktory i przeciążenie operatora.malloc
/free
tylko zawsze przydzielaj i zwalniaj pamięć.W rzeczywistości
new
jest dostatecznie konfigurowalny, że niekoniecznie zwraca pamięć ze sterty, ani nawet nie alokuje pamięci. Jednak domyślnienew
tak.źródło
Główną różnicą między new i malloc jest to, że new wywołuje konstruktor obiektu, a odpowiednie wywołanie delete wywołuje destruktor obiektu.
Istnieją inne różnice:
new
jest bezpieczny dla typu,malloc
zwraca obiekty typuvoid*
new
zgłasza wyjątek w przypadku błędu,malloc
zwracaNULL
i ustawia errnonew
jest operatorem i może być przeciążony,malloc
jest funkcją i nie może być przeciążonynew[]
, który przydziela tablice, jest bardziej intuicyjny i bezpieczny dla typu niżmalloc
malloc
-rozdzielone przydziały można zmienić za pomocąrealloc
,new
-rozdziałane przydziały nie mogą być zmienionemalloc
może przydzielić N-bajtową część pamięci,new
należy poprosić o przydzielenie tablicy, powiedzmy,char
typówPatrząc na różnice, podsumowanie jest takie, że malloc to C-esque, nowy to C ++ - esque. Użyj tego, który wydaje się odpowiedni dla twojej bazy kodu.
Chociaż nowe i Malloc są implementowane przy użyciu różnych algorytmów alokacji pamięci, w większości systemów nowe są implementowane wewnętrznie przy użyciu Malloc, nie powodując różnic na poziomie systemu.
źródło
Jest kilka rzeczy, które
new
tegomalloc
nie robią:new
konstruuje obiekt, wywołując konstruktor tego obiektunew
nie wymaga rzutowania przydzielonej pamięci.Tak więc, jeśli używasz
malloc
, musisz wyraźnie robić powyższe rzeczy, co nie zawsze jest praktyczne. Dodatkowonew
może być przeciążony, alemalloc
nie może być.Jednym słowem, jeśli używasz C ++, spróbuj użyć
new
jak najwięcej.źródło
również,
globalny nowy i usuń można zastąpić, malloc / free nie.
więcej nowych i usuwanych można zastąpić według typu.
źródło
new
idelete
są prymitywami C ++, które deklarują nową instancję klasy lub ją usuwają (wywołując w ten sposób destruktor klasy dla instancji).malloc
ifree
są funkcjami C. Przydzielają i zwalniają bloki pamięci (pod względem wielkości).Oba używają sterty do dokonania przydziału.
malloc
ifree
mimo to są bardziej „niskim poziomem”, ponieważ po prostu rezerwują fragment pamięci, który prawdopodobnie zostanie powiązany ze wskaźnikiem. Wokół tej pamięci nie są tworzone żadne struktury (chyba że uważasz, że tablica C jest strukturą).źródło
new i delete są operatorami w c ++; który również może być przeciążony. malloc i free są funkcjami c;
malloc zwraca null ptr, gdy zawiedzie, a nowy zgłasza wyjątek.
adres zwrócony przez malloc musi być ponownie rzutowany według typu, ponieważ zwraca (void *) malloc (rozmiar) Nowy zwraca wskaźnik wpisany.
źródło
źródło
malloc()
, musimy dołączyć<stdlib.h>
lub<alloc.h>
do programu, który nie jest wymaganynew
.new
idelete
może być przeciążony, alemalloc
nie może.new
, możemy przekazać adres, pod który chcemy przydzielić pamięć, ale nie jest to możliwe w przypadkumalloc
.źródło
alloc.h
nie jest standardowym nagłówkiem.<new>
jest wymagane, aby użyć nowego miejsca docelowego.Ten kod do użycia słowa kluczowego delete lub funkcji bezpłatnej. Ale kiedy tworzysz obiekt wskaźnika za pomocą „malloc” lub „new” i zwalniasz pamięć obiektu za pomocą kasowania, nawet ten wskaźnik obiektu może być funkcją wywołującą w klasie. Po tym użyj free zamiast usuń, to działa również po instrukcji free, ale kiedy używasz obu, wówczas tylko obiekt wskaźnika nie może wywołać funkcji w klasie .. kod wygląda następująco:
źródło
1. nowa składnia jest prostsza niż malloc ()
2.new/delete to operator, w którym funkcja malloc () / free () jest funkcją.
3.new/delete wykonuje się szybciej niż malloc () / free (), ponieważ nowy kod asemblera jest wklejany bezpośrednio przez kompilator.
4. możemy zmienić nowe / usunąć znaczenie w programie za pomocą przeciążenia operatora.
źródło