Domanda

Duplicato di: In quali casi utilizzo malloc vs nuovo?

Rileggo solo questa domanda:
Qual è la differenza tra " ; nuovo " e "malloc" e "calloc" in C ++?

Ho controllato le risposte ma nessuno ha risposto alla domanda:

  • Quando dovrei usare malloc invece che nuovo?

Ci sono un paio di ragioni (posso pensare a due).
Lascia che il migliore galleggi verso l'alto.

È stato utile?

Soluzione

Una coppia che mi viene in mente:

  • Quando è necessario che il codice sia portatile tra C ++ e C.
  • Quando si alloca memoria in una libreria che può essere chiamata da C, e il codice C deve liberare l'allocazione.

Altri suggerimenti

Dalle FAQ di Stroustrup su new / malloc che ho pubblicato su quella discussione:

  

Ogni volta che usi malloc () devi considerare l'inizializzazione e la conversione del puntatore di ritorno in un tipo appropriato. Dovrai anche considerare se hai il numero di byte giusto per il tuo uso. Non c'è differenza di prestazioni tra malloc () e new quando si tiene conto dell'inizializzazione.

Questo dovrebbe rispondere alla tua domanda.

Il miglior motivo per cui riesco a pensare di usare malloc in C ++ è quando interagisco con un'API C pura. Alcune API C con cui ho lavorato prendono la proprietà della memoria di alcuni parametri. Come tali sono responsabili della liberazione della memoria e quindi la memoria deve essere libera tramite la libera. Malloc lavorerà per questa puprose ma non necessariamente nuova.

In C ++, quasi mai. new è di solito un wrapper per malloc che chiama i costruttori (se applicabile.)

Tuttavia, almeno con Visual C ++ 2005 o superiore, utilizzando malloc può effettivamente comportare vulnerabilità della sicurezza rispetto a nuove .

Considera questo codice:

MyStruct* p = new MyStruct[count];
MyStruct* p = (MyStruct*)malloc(count* sizeof(MyStruct));

Sembrano equivalenti. Tuttavia, il codegen per il primo controlla effettivamente un overflow dei numeri interi in count * sizeof (MyStruct). Se il conteggio proviene da una fonte non sicura, può causare un overflow dei numeri interi con conseguente riduzione della quantità di memoria allocato, ma quando usi conteggio hai sovraccaricato il buffer.

Tutti hanno menzionato (usando parole leggermente diverse) quando si usa una libreria C che utilizzerà free () e ce ne sono molti in giro.

L'altra situazione che vedo è:

Quando utilizzi la tua gestione della memoria (perché per qualche motivo che hai scoperto attraverso la modellazione, il valore predefinito non è abbastanza buono). È possibile allocare il blocco di memoria con malloc e l'inizializzazione degli oggetti all'interno dei pool utilizzando il posizionamento new.

Uno dei motivi è che in C ++ puoi sovraccaricare il nuovo operatore.

Se si desidera essere sicuri di utilizzare l'allocazione di memoria della libreria di sistema nel proprio codice, è possibile utilizzare malloc.

Un programmatore C ++ dovrebbe raramente se mai aver bisogno di chiamare malloc. L'unico motivo per fare ciò a cui riesco a pensare sarebbe un'API mal costruita che si aspettava che passassi nella memoria malloc perché avrebbe fatto il libero. Nel tuo codice, new dovrebbe essere sempre uguale a malloc.

Se la memoria deve essere rilasciata da free () (nel tuo codice di qualcun altro), è assolutamente necessario usare malloc.

Altrimenti non ne sono sicuro. Un caso forzato è quando non vuoi che i distruttori vengano eseguiti all'uscita, ma in quel caso probabilmente dovresti avere oggetti che non hanno un fattore operativo.

Puoi usare malloc quando non vuoi preoccuparti di catturare le eccezioni (o utilizzare una versione non gettante di nuove).

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