Domanda

Sapete se c'è un modo per riportare malloc nel suo stato iniziale, come se il programma è stato appena iniziato?

ragione: Sto sviluppando un'applicazione embedded con le NintendoDS devkitPro e mi piacerebbe essere in grado di migliorare il supporto di debug in caso di difetti del software. Posso già catturare maggior parte degli errori e per esempio tornare al menu della console, ma questo non funziona quando la cattura di std :: bad_alloc.

Ho il sospetto che il codice che uso per "soft reboot" coinvolge malloc () stesso ad un certo punto non posso controllare, quindi mi piacerebbe "dimentica tutto ciò che riguarda l'applicazione in esecuzione e ottenere un nuovo inizio".

È stato utile?

Soluzione

L'unico modo per ottenere un nuovo inizio è quello di ricaricare l'applicazione dal deposito. Il DS carica tutto in RAM il che significa che la sezione dati vengono modificati in luogo.

Altri suggerimenti

Non c'è modo di fare questo portabile, anche se concievably un'implementazione integrata di C ++ potrebbe fornirlo come estensione. Si dovrebbe invece guardare a scrivere il proprio sistema di assegnazione, utilizzando pool di memoria, o utilizzare una libreria esistente.

Solo il tempo che ho fatto qualcosa di simile, abbiamo usato la nostra allocatore che avrebbe mantenuto un riferimento ad ogni blocchi allocati. Se volessimo far ritirare, avremmo liberare tutti i blocchi allocati e fare un longjmp per riavviare il programma.

scoiattolo via un po 'di memoria in una posizione per esempio globale.

int* not_used = new i[1024];

Poi, quando si ottiene un std::bad_alloc, cancellare NOT_USED e passare alla console di errore. L'idea è quella di dare la vostra gestione dei crash appena abbastanza spazio per fare quello che ti serve. Dovrete regolare la quantità di memoria è riservata in modo che la console non ha ricevuto anche fuori gli errori di memoria.

Se sei intelligente, NOT_USED potrebbe effettivamente essere utilizzato. Ma dovreste stare attenti che ciò che è stato utilizzando la memoria potrebbe essere soppresso senza preavviso.

Suppongo che se non altro è in esecuzione si può azzerare-scrivere l'intero blocco di memoria che l'API fornisce su Nintendo? Ma per il resto basta tenere traccia dei tuoi alloca.

In realtà, se si crea una classe CatchAndRelease per mantenere un riferimento ad ogni blocco di memoria allocata, al momento designato si poteva tornare indietro e cancellare quelli fuori.

In caso contrario, potrebbe essere necessario scrivere il proprio pool di memoria, come detto da Neil.

Avete mai bisogno di liberare la memoria in qualcosa di diverso last-in-first-out ordine? In caso contrario, io suggerirei che si definisce una matrice di utilizzare tutta la memoria disponibile (probabilmente dovrete di modificare i file linker per fare questo) e poi inizializzare un puntatore all'inizio di tale matrice. Quindi scrivere la propria funzione 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;
}

In questa implementazione, free_all_after () libera il puntatore indicata e tutto assegnati dopo che . Si noti che a differenza di altre implementazioni di malloc (), questo ha di zero sovraccarico. L'assegnazione LIFO è molto limitante, ma per molti sistemi embedded sarebbe del tutto adeguata.

std :: bad_alloc si verifica quando il nuovo fallisce e non può allocare la memoria richiesta. Ciò si verifica in genere quando l'heap è esaurito la memoria e quindi non può onorare la richiesta. Per questo motivo, non sarà in grado di allocare qualsiasi nuova memoria in modo affidabile nella pulizia.

Ciò significa che non si può allocare nuova memoria per la pulizia. La vostra unica speranza di ripulire con successo è quello di garantire che la memoria per il codice di pulitura è pre-assegnato ben prima che realmente bisogno.

Gli oggetti possono ancora essere newed in questa memoria di pulizia mediante l'operatore new inplace (cioè nuova in cui si fornisce un indirizzo di memoria)

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