struct foo
{
int a;
int b;
};
void* p = (void*)malloc(sizeof(struct foo));
((foo*)p)->a;//do something.
free(p);//Is this safe?
risposta
Sì.
malloc ritorna void *
e libera prende void *
, così alcuni dei vostri calchi sono prive di significato, e si sta sempre liberando un void *
anche se si sta iniziando con qualche altro tipo di puntatore.
sì, è sicuro.
Sì - free
prende un puntatore a vuoto, quindi quando lo si chiama, il puntatore viene (implicitamente) lanciato su un puntatore per annullare in ogni caso.
Il resto del codice non è così sicuro:
void* p = (void*)malloc(sizeof(foo));
Si dovrebbe non gettato il ritorno da malloc (in C). Questo può coprire l'errore di dimenticare #include <stdlib.h>
Sì. Il prototipo di funzione per free
è ancora:
void free(void *ptr);
Sì, è sicuro. Quando si assegna memoria, la libreria runtime tiene traccia delle dimensioni di ciascuna allocazione. Quando chiami free(), cerca l'indirizzo e, se trova un'assegnazione per quell'indirizzo, viene liberata la quantità corretta di memoria (il blocco che è stato assegnato a quell'indirizzo).
Forse non è sicuro a causa della magia che accade dietro le quinte. Il runtime C e/o il sistema operativo stesso monitorano attivamente la memoria restituita da malloc, incluse le dimensioni e la posizione. Vedi anche se ti sembra di passare un puntatore senza nome a free(), in effetti stai rimandando un riferimento a un oggetto che il gestore della memoria sta attivamente monitorando.
in C è perfettamente sicuro perché non ci sono distruttori da chiamare.
il sistema di memoria tiene traccia della loro dimensione di allocazioni.
in C++ è necessario eliminare lo stesso tipo di nuovo, compreso l'utilizzo dell'operatore delete [] per eliminare gli array new'ed.
questo è solo per assicurarsi che vengano chiamati i distruttori.
Sì, ma normalmente è un segno di design scadente. malloc() viene in genere utilizzato per allocare i buffer (array di grandi dimensioni dello stesso tipo primitivo) o oggetti (le strutture con i campi inizializzati). In entrambi i casi, il malloc e la connessione deve corrispondere così
unsigned char *rgba_buffer = malloc(width * hieght * 4);
/* use the buffer here */
free(rgba_buffer);
BITSTREAM *bs = bitstream("bitfile.boin");
/* use the bitstream here */
destroy_bitstream(bs);
typedef struct
{
FILE *fp;
unsigned char ch;
int index;
} BITSTREAM;
BITSTREAM *bitstream(const char *filename)
{
BITSTREAM *bs = malloc(sizeof(BITSTREAM));
bs->fp = fopen(filename "rb");
/* etc */
return bs;
}
void destroybitstream(BITSTREAM *bs)
{
if(bs)
{
if(bs->fp)
fclose(bs->fp);
free(bs);
}
}
In un caso, malloc e abbinare libera, nell'altra viene restituita la memoria allocata, ci sono anche risorse secondarie, e la partita costruttore e distruttore. Dovrebbe essere raro allocare una regione di memoria, ma non sapere a cosa serve. E non dovresti essere interleaving assegnazioni e libera caoticamente.
Il moderno C++ stringe tutto ciò con puntatori unici che "possiedono" l'oggetto. Mentre si può avere un puntatore unico a vuoto, sarebbe molto raro.
- 1. memcacheD Va bene?
- 2. Va bene avere parentesi nell'URL?
- 3. Va bene passare SQLCommand come parametro?
- 4. string [length()] in C++, va bene?
- 5. Perché non va bene che le variabili siano globali ma va bene per le funzioni?
- 6. Va bene lanciare gli eventi da Dispose()?
- 7. Va bene usare l'array [chiave] in PHP?
- 8. A cosa non va bene ASP.NET MVC?
- 9. Va bene usare try catch inside, infine?
- 10. Stringhe casuali in Python 2.6 (Va bene?)
- 11. Va bene restituire None da __new__?
- 12. Va bene confrontare i valori di PEPROCESS?
- 13. Va bene lasciare un canale aperto?
- 14. Va bene implementare Modernizr con Twitter Bootstrap?
- 15. Va bene usare LinearLayout invece di FrameLayout?
- 16. Va bene chiamare sureIndex su raccolte inesistenti?
- 17. Va bene non chiamare Thread # join?
- 18. Va bene chiamare clearInterval() prima di setInterval()?
- 19. In JavaScript, l'assegnazione concatenata va bene?
- 20. Va bene usare target = "_ blank" in HTML5?
- 21. È ambiguo o va perfettamente bene?
- 22. Va bene usare AWT con JavaFx?
- 23. Va bene usare boost :: shared ptr nell'interfaccia DLL?
- 24. Va bene creare un UIView su un thread in background?
- 25. Delphi: Va bene per un modulo liberarlo da solo?
- 26. Python: va bene restituire sia booleano che stringa?
- 27. Va bene installare sia Python 2.7 che 3.5?
- 28. Va bene usare più pseudo-elementi in css?
- 29. Va bene usare le funzioni std :: this_thread * di boost :: threads?
- 30. Va bene eseguire più istanze dello stesso eseguibile?
È valido anche C? Non dovrebbe essere sizeof (struct foo)?:) –
Non solo va bene il valore '' free '('' void * ', per definizione, tutto' free '()' mai vede è un 'void *', quindi tecnicamente, tutto ciò che viene liberato in C è 'void * ':-) –
@Daniel - Se mi chiedi, dovrebbe essere' struct foo * p = malloc (sizeof * p)); 'ma che ne so? –