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?

Author: Community, 2008-10-27

15 answers

Nowy / usuń

  • przydzielanie/zwalnianie pamięci
    1. pamięć przydzielona z 'Free Store'
    2. zwraca w pełni wpisany wskaźnik.
    3. new (wersja standardowa) nigdy nie zwraca NULL (rzuci po awarii)
    4. są wywoływane z Type-ID (kompilator oblicza rozmiar)
    5. ma wersję do obsługi tablic.
    6. realokacja (aby uzyskać więcej miejsca) nie jest obsługiwana intuicyjnie (z powodu konstruktora kopiującego).
    7. Czy wywołują malloc / free to implementacja zdefiniowany.
    8. można dodać nowy alokator pamięci do radzenia sobie z niską pamięcią (set_new_handler)
    9. operator new / delete może zostać prawnie nadpisany
    10. konstruktor / Destruktor używany do inicjalizacji / zniszczenia obiektu

Malloc / free

  • przydziela / zwalnia pamięć
    1. pamięć przydzielona z "sterty"
    2. zwraca void*
    3. zwraca NULL przy niepowodzeniu
    4. musi określać wymagany rozmiar w bajtach.
    5. tablica alokacji wymaga ręcznego obliczania przestrzeni.
    6. realokacja większej części pamięci prosta (bez konstruktora kopiującego, o który trzeba się martwić)
    7. będą Nie wywołaj nowe / Usuń
    8. nie ma możliwości łączenia kodu użytkownika z sekwencją alokacji, aby pomóc z niską pamięcią.
    9. 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.

 431
Author: Loki Astari,
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ęć.

 77
Author: Trap,
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ęć.

 27
Author: James Curran,
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ęć.

 13
Author: Encryptic,
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.

 12
Author: Treb,
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.

 9
Author: Steve Jessop,
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:

  1. new konstruuje obiekt przez wywołanie konstruktora tego obiektu
  2. new nie wymaga typowania przydzielonej pamięci.
  3. 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.

 5
Author: herohuyongtao,
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 typu void*

  • new rzuca wyjątek w przypadku błędu, malloc zwraca NULL 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 poprzez realloc, 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ów char

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.

 5
Author: Walter,
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.

 4
Author: DanJ,
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ą).

 3
Author: Jorge Córdoba,
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.

 2
Author: VishalTiwari,
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'.
 2
Author: Anurag Singh,
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 do new.
  • new i delete mogą być przeciążone, ale malloc 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 przypadku malloc.
 1
Author: ron davis,
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
 0
Author: chirag kadam,
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.

 -3
Author: Nitesh,
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