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.
newOperator 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 newoperator przydziela pamięć, a następnie wywołuje konstruktor, a deletenastępnie wywołuje destruktor, a następnie zwalnia pamięć.
newwywołuje ctor obiektu, deletewywołuje dtor.
malloci freepo prostu przydziel i zwolnij surową pamięć.
new/ deleteto C ++, malloc/ freepochodzi ze starego, dobrego C.
W C ++ newwywołuje konstruktor obiektów i deletewywołuje destruktor.
malloci free, pochodząc z epoki ciemności przed OO, przydzielaj i zwalniaj pamięć, nie wykonując żadnego kodu obiektu.
W C ++ new/ deletewywołaj odpowiednio Constructor / Destructor.
malloc/ freepo prostu przydziel pamięć ze sterty. new/ deleteprzydziel także pamięć.
Jedyne podobieństwa polegają na tym, że malloc/ newoba 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/ deletewykonuj dowolne inne prace dodatkowo, poprzez konstruktory, destruktory i przeciążenie operatora. malloc/ freetylko zawsze przydzielaj i zwalniaj pamięć.
W rzeczywistości newjest dostatecznie konfigurowalny, że niekoniecznie zwraca pamięć ze sterty, ani nawet nie alokuje pamięci. Jednak domyślnie newtak.
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:
newjest bezpieczny dla typu, malloczwraca obiekty typuvoid*
newzgłasza wyjątek w przypadku błędu, malloczwraca NULLi ustawia errno
newjest operatorem i może być przeciążony, mallocjest 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
mallocmoże przydzielić N-bajtową część pamięci, newnależy poprosić o przydzielenie tablicy, powiedzmy, chartypó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 newtego mallocnie 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 newmoże być przeciążony, ale mallocnie może być.
Jednym słowem, jeśli używasz C ++, spróbuj użyć newjak 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. malloci freemimo 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.newi deletemoże być przeciążony, ale mallocnie może.new, możemy przekazać adres, pod który chcemy przydzielić pamięć, ale nie jest to możliwe w przypadku malloc.alloc.hnie 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.