Jaka jest różnica między new/delete a malloc / free?
Jaka jest różnica między new
/delete
oraz malloc
/free
?
Related (duplicate?): w jakich przypadkach używam malloc vs new?
15 answers
Nowy / usuń
- przydzielanie/zwalnianie pamięci
- pamięć przydzielona z 'Free Store'
- zwraca w pełni wpisany wskaźnik.
- new (wersja standardowa) nigdy nie zwraca NULL (rzuci po awarii)
- są wywoływane z Type-ID (kompilator oblicza rozmiar)
- ma wersję do obsługi tablic.
- realokacja (aby uzyskać więcej miejsca) nie jest obsługiwana intuicyjnie (z powodu konstruktora kopiującego).
- Czy wywołują malloc / free to implementacja zdefiniowany.
- można dodać nowy alokator pamięci do radzenia sobie z niską pamięcią (set_new_handler)
- operator new / delete może zostać prawnie nadpisany
- konstruktor / Destruktor używany do inicjalizacji / zniszczenia obiektu
Malloc / free
- przydziela / zwalnia pamięć
- pamięć przydzielona z "sterty"
- zwraca void*
- zwraca NULL przy niepowodzeniu
- musi określać wymagany rozmiar w bajtach.
- tablica alokacji wymaga ręcznego obliczania przestrzeni.
- realokacja większej części pamięci prosta (bez konstruktora kopiującego, o który trzeba się martwić)
- będą Nie wywołaj nowe / Usuń
- nie ma możliwości łączenia kodu użytkownika z sekwencją alokacji, aby pomóc z niską pamięcią.
- malloc / free can NOT be overridden legally
Tabela porównująca cechy:
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ęć przydzielana przez new pochodzi z "wolnego sklepu", podczas gdy pamięć / align = "center" bgcolor = "# e0ffe0 " / cesarz chin / / align = center / To, czy te dwa obszary są takie same, jest szczegółami wdrożenia, co jest kolejnym powodem, dla którego malloc i new nie mogą być mieszane.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-05 06:11:38
Najbardziej istotną różnicą jest to, że operator new
alokuje pamięć, następnie wywołuje konstruktor, a delete
wywołuje destruktor, a następnie dealokuje pamięć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 14:25:37
new
wywołuje ctor obiektu, delete
wywołuje dtor.
malloc
& free
wystarczy przydzielić i zwolnić nieprzetworzoną pamięć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-27 15:08:30
W C++ new
/delete
wywołaj odpowiednio Konstruktor / Destruktor.
malloc
/free
wystarczy przydzielić pamięć ze sterty. new
/delete
przydziel również pamięć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 14:26:48
new
/delete
is C++, malloc
/free
pochodzi od starego dobrego C.
W C++, new
wywołuje konstruktor obiektów i delete
wywołuje destruktor.
malloc
i free
, pochodzące z Mrocznych Wieków przed OO, przydzielają i zwalniają tylko pamięć, bez wykonywania żadnego kodu obiektu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 14:26:05
Jedyne podobieństwa są takie, że malloc
/new
oba zwracają wskaźnik, który adresuje część pamięci na stercie, i oba gwarantują, że gdy taki blok pamięci zostanie zwrócony, nie zostanie zwrócony ponownie, chyba że najpierw go zwolnisz/usuniesz. Oznacza to, że obaj "przydzielają" pamięć.
Jednakże, new
/delete
dodatkowo wykonaj dowolne inne prace, poprzez konstruktory, destruktory i przeciążenie operatora. malloc
/free
tylko kiedykolwiek przydzielać i wolne pamięci.
W rzeczywistości new
jest na tyle konfigurowalny, że niekoniecznie zwraca pamięć ze sterty, a nawet w ogóle przydziela pamięć. Jednak domyślna new
tak.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 14:27:27
Jest kilka rzeczy, które new
robią to malloc
Nie:
-
new
konstruuje obiekt przez wywołanie konstruktora tego obiektu -
new
nie wymaga typowania przydzielonej pamięci. - nie wymaga przydzielania ilości pamięci, wymaga raczej liczby obiekty do budowy.
Więc, jeśli używasz malloc
, to musisz zrobić powyżej rzeczy wyraźnie, 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.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 20:58:44
Główna różnica pomiędzy new i malloc polega na tym, że new wywołuje konstruktor obiektu, a odpowiednie wywołanie delete wywołuje destruktor obiektu.
Istnieją inne różnice:
new
is type-safe,malloc
zwraca obiekty typuvoid*
-
new
rzuca wyjątek w przypadku błędu,malloc
zwracaNULL
i ustawia errno -
new
jest operatorem i może być przeciążony, {[1] } jest funkcją i nie może być przeciążony new[]
, który przydziela tablice, jest bardziej intuicyjny i bezpieczny dla typu niżmalloc
-
malloc
-pochodne alokacje mogą być zmieniane poprzezrealloc
,new
-przydziały pochodne nie mogą być zmieniane -
malloc
można przydzielić N-bajtową część pamięci,new
należy poprosić o przydzielenie tablicy typówchar
Patrząc na różnice, podsumowanie jest malloc jest C-esque, new jest C++-esque. Użyj tego, który czuje się odpowiedni dla twoja baza kodów.
Chociaż implementacja new i malloc jest legalna przy użyciu różnych algorytmów alokacji pamięci, w większości systemów new jest wewnętrznie implementowana przy użyciu malloc, nie dając żadnej różnicy na poziomie systemu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-15 21:02:51
Również,
Globalny new I delete może zostać nadpisany, malloc / free nie może.
Kolejne nowe i delete mogą być nadpisywane dla każdego typu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-27 15:35:53
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 danej instancji).
malloc
i free
są funkcjami C i przydzielają i uwalniają bloki pamięci (w rozmiarze).
Oba używają sterty do alokacji. malloc
i free
są jednak bardziej "niskopoziomowe", ponieważ po prostu rezerwują część pamięci, która prawdopodobnie będzie związana ze wskaźnikiem. Nie powstają żadne struktury wokół tej pamięci (chyba, że tablica C jest strukturą).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-01 21:44:12
New I delete są operatorami w c++; które również mogą być przeciążone. malloc i free są funkcjami w c;
Malloc zwraca null ptr, gdy nie powiedzie się podczas wyjątku New throws.
Adres zwracany przez malloc należy wpisać ponownie, ponieważ zwraca(void*)malloc (size) New zwraca wpisany wskaźnik.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-10 11:13:28
- new jest operatorem, podczas gdy malloc () jest fucntion.
- new zwraca dokładny typ danych, podczas gdy malloc () zwraca void * (wskaźnik typu void).
- malloc (), pamięć nie jest inicjalizowana, a domyślną wartością jest garbage, podczas gdy w przypadku new, pamięć jest inicjalizowana z domyślną wartością, jak z 'zero( 0)' W przypadku int.
- delete i free() mogą być używane dla wskaźników 'NULL'.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-19 06:26:17
- aby użyć
malloc()
, musimy zawierać<stdlib.h>
lub<alloc.h>
w programie, który nie jest wymagany donew
. -
new
idelete
mogą być przeciążone, alemalloc
nie mogą. - używając lokacji
new
, możemy podać adres, w którym chcemy przydzielanie pamięci, ale nie jest to możliwe w przypadkumalloc
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-18 21:43:47
Ten kod do użycia słowa kluczowego delete lub funkcji wolnej. Ale kiedy stworzyć obiekt wskaźnika za pomocą 'malloc' lub ' new ' i deallokować pamięć obiektu za pomocą Usuń nawet ten wskaźnik obiektu może być wywołaniem funkcji w klasie. Po że używasz free zamiast delete, to działa również po free statement , ale gdy używasz obu, to tylko obiekt pointer nie może wywołać funkcji w klasie.. kod jest następujący:
#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;
}
Wyjście:
Hello Hi 0x2abfef37cc20
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 11:08:45
1.nowy syntex jest prostszy niż malloc ()
2.new / delete jest operatorem, w którym malloc () / free() jest funkcją.
3.new / delete wykonaj szybciej niż malloc () / free () ponieważ nowy kod assemly wklejony bezpośrednio przez kompilator.
4.możemy zmienić znaczenie new/delete w programie za pomocą nakładki operatora.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-15 14:45:18