todas telefono samsung saber por para liberado las fabrica esta desbloqueado compañias como celular c pointers free

telefono - ¿Cómo comprobar si un puntero ya está liberado en C?



como saber si mi nokia esta liberado (7)

Me gustaría comprobar si un puntero ya está liberado o no. ¿Cómo hago esto usando gnu compiler set?


No hay una manera confiable de saber si se ha liberado un puntero, como comentó Greg, la memoria liberada podría estar ocupada por otros datos irrelevantes y obtendrá un resultado incorrecto.

Y, de hecho, no hay una forma estándar de comprobar si se libera un puntero. Dicho esto , glibc tiene funciones ( mcheck , mprobe ) para encontrar el estado malloc de un puntero para la comprobación de la coherencia del montón , y una de ellas es ver si se libera un puntero.

Sin embargo , estas funciones se utilizan principalmente para la depuración solamente, y no son seguras para subprocesos . Si no está seguro del requisito, evite estas funciones. Solo asegúrate de que has emparejado malloc / free .

Ejemplo http://ideone.com/MDJkj :

#include <stdio.h> #include <stdlib.h> #include <mcheck.h> void no_op(enum mcheck_status status) {} int main() { mcheck(&no_op); void* f = malloc(4); printf("%d (should be %d)/n", mprobe(f), MCHECK_OK); printf("%d (should be %d)/n", mprobe(f), MCHECK_OK); free(f); printf("%d (should be %d)/n", mprobe(f), MCHECK_FREE); printf("%d (should be %d)/n", mprobe(f), MCHECK_FREE); return 0; }


Puede extender el concepto de asignar NULL al valor del puntero escribiendo una macro que lo haga por usted. Por ejemplo:

#define FREE(ptr) do{ / free((ptr)); / (ptr) = NULL; / }while(0)

Luego, siempre que se asegure de que su código solo use GRATIS () y no libre (), puede estar bastante seguro de que el código que escribió no libera la misma memoria dos veces. Por supuesto, eso no hace nada para evitar múltiples llamadas a funciones de biblioteca que liberan memoria. Y no hace nada para garantizar que haya un servicio gratuito para cada malloc.

Puede intentar esto con una función, pero se vuelve incómodo porque tiene que incluir un operador de referencia y ya no parece una llamada normal a free ().


Sé que esta respuesta es a little bit tarde, pero acabo de leer esta respuesta y escribí un código para verificar lo siguiente:

Libre pondrá el bloque de memoria en su propia lista de bloqueo libre . Normalmente, también intenta fusionar bloques adyacentes en el espacio de direcciones. La lista de bloqueo libre es solo una lista circular de fragmentos de memoria que tienen, por supuesto, algunos datos de administrador al principio. La lista libre es también la primera ubicación , malloc busca una nueva porción de memoria cuando es necesario. Se escanea antes de solicitar una nueva memoria del sistema operativo . Cuando se encuentra un fragmento que es más grande que la memoria necesaria, solo se divide en dos partes. Uno se devuelve a la persona que llama, el otro se coloca de nuevo en la lista libre.

Este código comprueba solo si se libera el primer puntero que se asignó:

int is_freed(void *p) { void * q; char p_addr [50]; char q_addr [50]; sprintf(p_addr, "%p", p); q = malloc (1); sprintf(q_addr, "%p", q); free (q); return ! strcmp(q_addr, p_addr); }

He probado este código en HP-UX y Linux Redhat y funciona, en el caso de un solo puntero.


Usted no puede La forma de rastrear esto sería asignar el puntero a 0 o NULL después de liberarlo. Sin embargo, como lo mencionó Fred Larson, esto no hace nada a otros indicadores que apuntan a la misma ubicación.

int* ptr = (int*)malloc(sizeof(int)); free(ptr); ptr = NULL;


Usted no puede Simplemente asigne NULL a él después de free para asegurarse de que no lo libere dos veces (está bien free(NULL) ).

Mejor aún, si es posible, no escriba el código donde "olvida" que ya lo liberó.

EDITAR

Interpretar la pregunta como cómo averiguar si la memoria apuntada por un puntero ya está liberada : no puede hacerlo. Tienes que hacer tu propia contabilidad.


Usted no, ya que no puede.

Lleve un registro de los indicadores que obtenga de malloc() y libere solo esos, y solo una vez.

Si lo desea, la memoria no tiene memoria, por lo que no sabe si está asignada o no. Solo el administrador de memoria de su sistema operativo puede indicarle eso (pero C no incluye ningún mecanismo estandarizado para consultar esta información).


Así es como lo hago:

bool pointer_allocated(void* ptr) { return ptr != NULL; }