2013-07-31 4 views
5
void newHandler() { 
    cdebug << "memory allocation failure" << std::endl; 
    throw std::bad_alloc(); 
} 

int main() { 
    std::set_new_handler(newHandler); 
    // ... 
} 

volta newHandler è stabilito come il nostro gestore di errori, verrà chiamato quando alcuna assegnazione mucchio fallisce. La cosa interessante del gestore dell'errore è che verrà chiamato continuamente finché l'allocazione della memoria non riesce o la funzione genera un errore.cattura un'eccezione per l'allocazione di memoria

La mia domanda sopra il testo è ciò che intende authore per "finché l'allocazione di memoria non ha esito positivo o la funzione genera un errore". In che modo la funzione può generare un errore in questo caso? Richiesta con esempio per capire.

Grazie per il vostro tempo e aiuto.

+0

possibile duplicato (http://stackoverflow.com/questions/7194127/how- dovrebbe-i-write-iso-c-standard-conformant-custom-new-and-delete-operators) –

+0

@Loki: Questa è una domanda più specifica del possibile duplicato che hai postato. Ma penso che il titolo dovrebbe essere cambiato in: Come usare std :: set_new_handler – Phong

risposta

7

In sostanza, il gestore può avere 3 comportamento

  • Si getta un bad_alloc (o sua classe derivata).
  • Si chiama uscita o funzione abord, che ferma l'esecuzione del programma
  • E ritorno, nel qual caso un nuovo tentativo di assegnazione avverrà

arbitri: http://www.cplusplus.com/reference/new/set_new_handler/

Questo è utile se non volete gestire l'errore di allocazione su ogni nuova chiamata. A seconda del sistema (utilizzando molta memoria) è possibile ad esempio liberare memoria allocata (cache), quindi la successiva allocazione della memoria di prova può avere successo.

void no_memory() 
{ 
    if(cached_data.exist()) 
    { 
    std::cout << "Free cache memory so the allocation can succeed!\n"; 
    cached_data.remove(); 
    } 
    else 
    { 
    std::cout << "Failed to allocate memory!\n"; 
    std::exit (1); // Or throw an expection... 
    } 
} 

std::set_new_handler(no_memory); 
+0

"invia un expection" dovrebbe essere "lanciare un'eccezione" –

+0

@Mike: Grazie, lo correggerò. – Phong

0

L'intento è che il gestore può liberare la memoria, di ritorno, e poi new() può ritentare l'allocazione. new() chiamerà il gestore fintanto che l'assegnazione continua a non riuscire. Il gestore può interrompere questi tentativi lanciando bad_alloc(), in sostanza dicendo "Non riesco a liberare più memoria, quindi l'allocazione non può superare".

Maggiori dettagli qui: [? Come dovrei scrivere ISO C++ standard conforme costume nuovo e cancellare gli operatori]

http://www.cplusplus.com/reference/new/set_new_handler/