struct foo
{
int a;
int b;
};
void* p = (void*)malloc(sizeof(struct foo));
((foo*)p)->a;//do something.
free(p);//Is this safe?
Respuesta
Sí.
malloc regresa void *
y libre toma void *
, por lo que algunos de sus moldes no tienen sentido, y siempre estamos liberando una void *
incluso si estás empezando con algún otro tipo de puntero.
sí, es seguro.
Sí - free
toma un puntero a vacío, por lo que cuando lo llamas, el puntero se convierte (implícitamente) en un puntero para anular en cualquier caso.
El resto de su código no es tan segura:
void* p = (void*)malloc(sizeof(foo));
Usted debe no tire la vuelta de malloc (en C). Esto puede encubrir el error de olvidar a #include <stdlib.h>
Sí. El prototipo de función para free
es par:
void free(void *ptr);
Sí, es seguro. Al asignar memoria, la biblioteca de tiempo de ejecución realiza un seguimiento del tamaño de cada asignación. Cuando llama a free(), busca la dirección, y si encuentra una asignación para esa dirección, se libera la cantidad correcta de memoria (el bloque que se asignó a esa dirección).
Tal vez no siente seguro debido a la magia que ocurre detrás de las escenas. El tiempo de ejecución de C y/o el propio sistema operativo está realizando un seguimiento activo de la memoria devuelta por malloc, incluido su tamaño y ubicación. Aunque parece que está devolviendo un puntero sin letra a free(), de hecho, remite una referencia a un objeto que el administrador de memoria está rastreando activamente.
en C es perfectamente seguro porque no hay destructores para llamar.
el sistema de memoria realiza un seguimiento del tamaño de las asignaciones.
en C++ debe eliminar el mismo tipo que el nuevo, incluido el uso del operador delete [] para eliminar matrices nuevas.
esto es solo para asegurarse de que se invocan destructores.
Sí, pero normalmente es un signo de diseño deficiente. malloc() se utiliza normalmente para asignar almacenamientos intermedios (matrices grandes del mismo tipo primitivo) u objetos (estructuras con campos inicializados). En ambos casos, el malloc y la libre debe coincidir con lo que
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);
}
}
En un caso, malloc y sin rapport, en la otra se devuelve la memoria asignada, también hay recursos secundarios, y el partido constructor y el destructor. Sería raro asignar una región de memoria, pero no saber para qué se usa. Y no debe intercalar asignaciones y libera caóticamente.
C++ moderno ajusta todo esto con punteros únicos que "poseen" el objeto. Aunque puede tener un puntero único para anular, sería muy raro.
- 1. ¿Está bien agregar siempre un controlador de eventos vacío?
- 2. vacío "liberar" ASSERT macro bloquea el programa?
- 3. memcacheD Esto está bien?
- 4. ¿Está bien usar __doPostBack()?
- 5. $ _SERVER ['PHP_AUTH_USER'] está vacío
- 6. ¿STL está vacío()?
- 7. HttpContext.Current.User.Identity.Name está vacío
- 8. ¿Está vacío de tragar?
- 9. getAnnotations() está vacío
- 10. NSString está vacío
- 11. Mi httpd.conf está vacío
- 12. error: el archivo objeto está vacío .git/objects /../ .. está vacío - fatal: objeto suelto ... está dañado
- 13. jquery: si ul está vacío
- 14. ¿Está bien lanzar un java.lang.Error?
- 15. ¿Este código está bien definido?
- 16. ¿Está bien aún usar tablas?
- 17. ¿Está bien derivar de System.ArgumentException?
- 18. ¿Este código está bien definido?
- 19. ¿Está bien omitir "devolver ninguno"?
- 20. ¿Está bien con archivos binarios?
- 21. ¿Está vacío enum (enum {};) portátil?
- 22. Observable creadoArray está siempre vacío
- 23. compruebe si NSNumber está vacío
- 24. Jquery - JSON.stringify, array está vacío
- 25. jQuery .error jqXHR.responseText está vacío
- 26. por qué $ _REQUEST está vacío
- 27. jQuery - validación de entrada sencilla - "vacío" y "no está vacío"
- 28. ¿Qué devuelve un IQueryable vacío como cuando está vacío?
- 29. ¿Qué significa exactamente cuando $ _FILES está vacío?
- 30. ¿Está bien pasar NULL a un parámetro de bloque?
¿Esto es válido incluso C? ¿No debería ser eso sizeof (struct foo)?:) –
No solo está bien para 'free()' a 'void *' valor, por definición, todo 'free()' ever ve es un 'void *', así que, técnicamente, todo lo liberado en C es 'void * ':-) –
@Daniel - Si me preguntas, debería ser' struct foo * p = malloc (sizeof * p)); 'pero ¿qué sé? –