Pregunta

¿Sabe si hay una manera de traer de vuelta malloc en su estado inicial, como si el programa estaba empezando?

razón: Estoy desarrollando una aplicación embebida con los NintendoDS devkitPro y me gustaría ser capaz de mejorar el soporte de depuración en caso de fallos de software. Ya puedo coger la mayoría de los errores y, por ejemplo, regresar al menú de la consola, pero esto no funciona cuando la captura de std :: bad_alloc.

Sospecho que el código que utilizo para "reinicio suave" implica malloc () en sí en algún momento que no puedo controlar, por lo que me gustaría "olvidar todo lo relacionado con la aplicación en ejecución y obtener un nuevo comienzo".

¿Fue útil?

Solución

La única manera de conseguir un nuevo comienzo es para recargar la aplicación de almacenamiento. El DS cargas todo en la memoria RAM que significa que la sección de datos es modificado en su lugar.

Otros consejos

No hay manera de hacer esto de forma portátil, aunque concievably una aplicación incrustada de C ++ puede suministrar como una extensión. En su lugar debe mirar a la escritura de su propio sistema de asignación, el uso de grupos de memoria, o utilizar una biblioteca existente.

Sólo el tiempo que hice algo similar, utilizamos nuestro propio asignador que mantendría una referencia a cada uno de los bloques asignados. Si quisiéramos deshacer, podríamos liberar a todos los bloques asignados y hacer un longjmp para reiniciar el programa.

ardilla de distancia un poco de memoria en una ubicación por ejemplo mundial.

int* not_used = new i[1024];

A continuación, cuando se obtiene un std::bad_alloc, eliminar NOT_USED y pasar a la consola de error. La idea es dar a su manejador de fallos espacio suficiente para hacer lo que necesita. Vas a tener que ajustar la cantidad de memoria se reserva para que su consola no recibió también fuera de errores de memoria.

Si eres inteligente, NOT_USED en realidad podría ser utilizado. Pero habría que tener cuidado de que todo lo que se utiliza la memoria podría ser eliminado sin previo aviso.

supongo que si nada más se está ejecutando se podía cero-escribir todo el bloque de memoria que la API proporciona en la Nintendo? Pero por lo demás sólo mantener un registro de sus asigna.

De hecho, si se crea una clase CatchAndRelease para mantener una referencia a todos y cada bloque de memoria asignada, en el momento requerido pudiera volver atrás y borrar aquellos cabo.

De lo contrario, puede que tenga que escribir su propio bloque de memoria, como se ha mencionado por Neil.

¿Alguna vez se necesita para liberar memoria en que no sea el último en entrar, primero en salir para nada? Si no es así, me gustaría sugerir que defina una serie de usar toda la memoria disponible (es probable que tenga que modificar los archivos de engarce para hacer esto) y luego inicializar un puntero al comienzo de esa matriz. A continuación, escribir su propia función malloc ():

char *allocation_ptr = big_array;

void *malloc(size_t n)
{
  void *temp = (void*)allocation_ptr;
  if (allocation_ptr > END_OF_ALLOCATION_AREA - n)
    return 0;
  allocation_ptr += n;
  return temp;
}

void free_all_after(void *ptr)
{
  if (ptr)
    allocation_ptr = (char*)ptr;
}

En esta implementación, free_all_after () va a liberar el puntero indicado y todo lo asignado después de que . Tenga en cuenta que a diferencia de otras implementaciones de malloc (), éste tiene cero overhead. La asignación LIFO es muy limitante, pero para muchos sistemas embebidos sería completamente adecuado.

std :: bad_alloc ocurre cuando hay una falla y no se puede asignar la memoria requerida. Esto normalmente se producirá cuando la pila se ha agotado la memoria y por lo tanto no puede aceptar la solicitud. Por esta razón, usted no será capaz de asignar cualquier nueva memoria de forma fiable en la limpieza.

Esto significa que usted no puede asignar memoria nueva para la limpieza. Su única esperanza de limpiar con éxito es asegurarse de que la memoria para el código de limpieza es preasignados mucho antes de que realmente lo necesitan.

Los objetos pueden todavía ser renovada en esta memoria de la limpieza mediante el operador new in-situ (es decir, nueva en la que proporcione una dirección de memoria)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top