2009-04-30 3 views
47

Qual è la differenza tra "nuovo" e "malloc" e "calloc" e altri in famiglia?Qual è la differenza tra "new" e "malloc" e "calloc" in C++?

(Quando) Ho bisogno di qualcosa di diverso da "nuovo"?

Uno di questi è implementato utilizzando un altro?

+2

Se si utilizza lo STL, raramente è necessario utilizzare l'allocazione di memoria esplicita. – Brian

+1

duplicati di http://stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free –

+0

Controllare il duplicato collegato questione, come la sua risposta è più completa: http: //stackoverflow.com/questions/240212/what-is-the-difference-between-new-delete-and-malloc-free –

risposta

65

new e delete sono caratteristiche specifiche di C++. Non esistevano in C. malloc è il modo in cui la vecchia scuola C fa le cose. La maggior parte delle volte non è necessario utilizzarlo in C++.

  • malloc alloca memoria non inizializzata. La memoria allocata deve essere rilasciata con free.
  • calloc è come malloc ma inizializza la memoria allocata con una costante (0). Deve essere liberato con free.
  • new inizializza la memoria allocata chiamando il costruttore (se si tratta di un oggetto). La memoria allocata con new dovrebbe essere rilasciata con delete (che a sua volta chiama il distruttore). Non è necessario che tu specifichi manualmente la dimensione necessaria e la lanci al tipo appropriato. Quindi, è più moderno e meno incline agli errori.
+1

Lo "scratch space" è un termine che hai appena inventato? –

+0

@Neil Butterworth: non lo so. Ma penso di averlo letto da qualche parte ... Glossario: scratch space: n. memoria non inizializzata :) –

+0

mantenendo la terminologia specifica di C++, un array è anche un oggetto, e verranno chiamati i vettori di tutti i suoi sotto-oggetti. –

5

L'utilizzo di nuovi significa che i costruttori saranno richiamati nella memoria appena allocata. Se la cosa assegnata non ha costruttori, la nuova è funzionalmente identica a malloc. e dovrebbe normalmente essere usato in pereference ad esso.

nuovo può o non può essere implementato in termini di malloc - lo standard C++ non richiede entrambi gli approcci.

8
  • nuovi alloca e chiamate al ctor (l'ordine è specificato), eliminare il dtor e libera la memoria allocata da una chiamata al nuovo
  • malloc alloca solo alcuni memoria, libera cancella memoria allocata da malloc
  • nuovo può essere implementato usando malloc (non richiesto se dallo standard)
  • calloc fa la stessa cosa come malloc e zeroizes anche la memoria appena allocata

come altri messaggi hanno sottolineato: mal loc/libero è parte di C++ per essere compatibile con C.

Vedi anche: Stroustrup: new vs malloc

1

la principale differenza tra nuovo e malloc posso ricordare è che non si può riallocare memoria allocata da nuova utilizzando realloc. Quindi, se si voleva per aumentare/diminuire la dimensione del blocco di memoria, si doveva allocare un nuovo blocco e copiare tutto sopra.

calloc consente di inizializzare il blocco di memoria si alloca mentre malloc non lo fa.

+0

In effetti, questo è lo stesso per 'malloc'.La funzione 'realloc' lo fa la maggior parte del tempo. –

1

Quando si nuovo un oggetto, lo spazio per l'oggetto non viene solo assegnato ma viene chiamato il costruttore dell'oggetto. Ma questo è il modo in cui C++ suo fatto, malloc è il vecchio modo versione C di allocazione di memoria.calloc è lo stesso di malloc, tranne che cancella la memoria a tutti i bit zero.

16

new/delete + new []/delete []:

  • nuovo/eliminare è il modo C++ per allocare la memoria e deallocare memoria dal mucchio.
  • nuovo [] ed elimina [] è il modo C++ per allocare matrici di memoria contigua.
  • è necessaria in quanto è più di tipo sicuro che malloc
  • è necessaria in quanto si chiama il costruttore/distruttore
  • Non può essere utilizzato in un modo realloc, ma può utilizzare nuova collocazione di riutilizzare lo stesso buffer dei dati
  • dati non può essere assegnato con il nuovo e liberato con connessione, né delete []

malloc/libero + famiglia:

  • malloc/free/family è il modo C di allocare e liberare memoria dall'heap.
  • calloc è lo stesso di malloc, ma inizializza anche la memoria
  • dovrebbe essere usato se potrebbe essere necessario riallocare la memoria
  • I dati non possono essere allocata con malloc e liberato con eliminazione né delete []

Vedi anche il mio related answer here

+0

Riconosco quel formato :-) –

+0

@Martin York: Vedo ora dalla domanda duplicata collegata. Mi piacciono di più le tue liste :) Penso che sia il formato delle scommesse per questi tipi di domande in cui confronti e confronti 2 cose. Almeno ottengo sempre voti alti per quel tipo di risposte formattate. –

5

Non hai bisogno di altro che di nuovo. È un sostituto completo per malloc in C++.

Per quanto riguarda la differenza: Malloc assegna solo memoria. Nuova memoria allocata e chiama i costruttori. Allo stesso modo, libera solo la memoria. Elimina rilascia la memoria e chiama il distruttore.

Una parola di avvertimento: Non mescolare i due idiomi. I risultati non sono definiti.

+0

Fare clic su questo collegamento http://www.ritambhara.in/difference-between-malloc-calloc-free-and-realloc-functions/ – Jaichander