Qual è la differenza tra & # 8220; new & # 8221; e & # 8220; malloc & # 8221; e & # 8220; calloc & # 8221; in C ++? [duplicare]

StackOverflow https://stackoverflow.com/questions/807939

Domanda

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

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

Uno di questi è implementato con altri?

È stato utile?

Soluzione

new e delete sono caratteristiche specifiche di C ++. Non esistevano in C. malloc è il modo C della vecchia scuola di fare le cose. Il più delle volte, non sarà necessario utilizzarlo in C ++.

  • malloc alloca memoria non inizializzata. La memoria allocata deve essere rilasciata con gratuito .
  • calloc è come malloc ma inizializza la memoria allocata con una costante (0). Deve essere liberato con gratuito .
  • 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 di cui hai bisogno e lanci il tipo appropriato. Pertanto, è più moderno e meno soggetto a errori.

Altri suggerimenti

nuovo / elimina + nuovo [] / elimina []:

  • new / delete è il modo C ++ per allocare memoria e deallocare memoria dall'heap.
  • new [] ed delete [] è il modo c ++ per allocare array di memoria contigua.
  • Dovrebbe essere usato perché è più sicuro rispetto a malloc
  • Dovrebbe essere usato perché chiama il costruttore / distruttore
  • Non può essere utilizzato in modo riallocato, ma può utilizzare il posizionamento nuovo per riutilizzare lo stesso buffer di dati
  • I dati non possono essere allocati con nuovi e liberati gratuitamente, né eliminare []

malloc / free + family:

  • malloc / free / family è il modo C per allocare e liberare memoria dall'heap.
  • calloc è uguale a malloc ma inizializza anche la memoria
  • Dovrebbe essere usato se potrebbe essere necessario riallocare la memoria
  • I dati non possono essere assegnati con malloc e liberati con delete né delete []

Vedi anche la mia relativa risposta qui

  • nuove allocazioni e chiamate a ctor (l'ordine non è specificato), elimina il dtor e libera la memoria allocata da una chiamata a new
  • malloc alloca solo un po 'di memoria, libera elimina la memoria allocata da malloc
  • nuovo può essere implementato usando malloc (non richiesto dallo standard)
  • calloc fa la stessa cosa di malloc e azzera anche la memoria appena allocata

Come altri post hanno sottolineato: malloc / free fa parte di C ++ per essere compatibile con C.

Vedi anche: Stroustrup: nuovo vs malloc

L'uso di nuovi significa che i costruttori saranno chiamati sulla memoria appena allocata. Se la cosa assegnata non ha costruttori, new è funzionalmente identico a malloc. e dovrebbe normalmente essere usato per perferenza ad esso.

new può o non può essere implementato in termini di malloc - lo standard C ++ non richiede alcun approccio.

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

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

Un avvertimento: non mescolare i due modi di dire. I risultati non sono definiti.

la principale differenza tra new e malloc che posso ricordare è che non è possibile riallocare la memoria allocata da new usando realloc. Quindi, se si desidera aumentare / ridurre la dimensione del blocco di memoria, è necessario allocare un nuovo blocco e copiare tutto.

Calloc ti consente di inizializzare il blocco di memoria che assegni mentre malloc no.

Quando nuovo un oggetto, lo spazio per l'oggetto non viene solo allocato ma viene chiamato il costruttore dell'oggetto. Ma questo è il modo in cui C ++ è stato fatto, malloc è il vecchio modo in C di allocare memoria. calloc è uguale a malloc , tranne per il fatto che cancella la memoria su tutti i bit zero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top