Jaka jest różnica między new
/delete
i malloc
/ free
?
Powiązane (duplikat?): W jakich przypadkach używam malloc vs nowy?
Jaka jest różnica między new
/delete
i malloc
/ free
?
Powiązane (duplikat?): W jakich przypadkach używam malloc vs nowy?
Odpowiedzi:
Tabela porównania funkcji:
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
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.
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, a delete
następnie wywołuje destruktor, a następnie zwalnia pamięć.
new
wywołuje ctor obiektu, delete
wywołuje dtor.
malloc
i free
po prostu przydziel i zwolnij surową pamięć.
new
/ delete
to C ++, malloc
/ free
pochodzi ze starego, dobrego C.
W C ++ new
wywołuje konstruktor obiektów i delete
wywołuje destruktor.
malloc
i free
, pochodząc z epoki ciemności przed OO, przydzielaj i zwalniaj pamięć, nie wykonując żadnego kodu obiektu.
W C ++ new
/ delete
wywołaj odpowiednio Constructor / Destructor.
malloc
/ free
po prostu przydziel pamięć ze sterty. new
/ delete
przydziel także pamięć.
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ślnie new
tak.
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
zwraca NULL
i ustawia errno
new
jest operatorem i może być przeciążony, malloc
jest funkcją i nie może być przeciążony
new[]
, 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ć zmienione
malloc
może przydzielić N-bajtową część pamięci, new
należy poprosić o przydzielenie tablicy, powiedzmy, char
typów
Patrzą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.
Jest kilka rzeczy, które new
tego malloc
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. Dodatkowo new
może być przeciążony, ale malloc
nie może być.
Jednym słowem, jeśli używasz C ++, spróbuj użyć new
jak najwięcej.
new
i delete
są prymitywami C ++, które deklarują nową instancję klasy lub ją usuwają (wywołując w ten sposób destruktor klasy dla instancji).
malloc
i free
są funkcjami C. Przydzielają i zwalniają bloki pamięci (pod względem wielkości).
Oba używają sterty do dokonania przydziału. malloc
i free
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ą).
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.
malloc()
, musimy dołączyć <stdlib.h>
lub
<alloc.h>
do programu, który nie jest wymagany new
.new
i delete
może być przeciążony, ale malloc
nie może.new
, możemy przekazać adres, pod który chcemy przydzielić pamięć, ale nie jest to możliwe w przypadku malloc
.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:
#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;
}
wynik :
Hello Hi 0x2abfef37cc20
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.