2010-07-23 14 views
11

Il mio programma (un browser Web in modalità testo) assegna dinamicamente memoria.Devo liberare memoria allocata in caso di interruzione anomala?

I blocchi non necessari sono gratuiti durante il runtime, ovviamente. E libererò tutto prima della normale interruzione, in modo che i controllori della perdita di memoria non mi diano falsi positivi (e che siano flessibili se si rendono necessari importanti refactoring).

Ora, ciò che faccio non do sta liberando memoria prima della terminazione anomala. (Attualmente, il mio programma termina su segnali e dopo mallocs/reallocs falliti.)

La mia domanda è: consideri questo cattivo stile? Devo liberare in caso di interruzione anomala?

+0

il sistema riacquisirà memoria quando il processo termina, non è vero? –

risposta

12

No. Penso che sia perfettamente accettabile semplicemente alzare le mani e lasciare che il sistema operativo recuperi la memoria dopo che il programma è terminato. Penso che se questa è veramente una situazione anomala e l'intenzione è quella di terminare il programma, allora un programma ben educato dovrebbe semplicemente ripulire eventuali risorse/blocchi del disco ed uscire il più rapidamente possibile.

4

A mio parere non è necessario liberare la memoria in caso di arresto anomalo. Quando il processo termina, il sistema operativo reclamerà la memoria, quindi tutto ciò che devi fare è uscire.

D'altra parte, altre risorse (ad esempio file aperti) devono essere chiuse o almeno scaricate; in caso contrario, potrebbero non essere memorizzate/archiviate incomplete a causa del buffering.

0

La terminazione anomala del processo non porta a blocchi di memoria che non possono essere utilizzati da altri processi (in pratica significa che sono liberi), se sono stati allocati da esso.

Assegniamo/libera memoria utilizzando le direttive OS in modo che un sistema operativo non bacato tenga traccia dei blocchi mem per ogni processo e li traduca in uno spazio di memoria virtuale contiguo. Dopo un processo di morte, il caricatore del sistema operativo lo segnala e tutta la memoria viene richiamata. Le cose si complicano quando i processi condividono la memoria.

I processi di peering, se non derivati ​​/ avviati/biforcati dal processo (ad esempio, considerano un componente esterno che serve molti processi per accedere alle risorse multimediali), potrebbero aver creato memoria (ad esempio un buffer) per servire il processo. A seconda della politica di proprietà di questi componenti esterni, quella memoria potrebbe non essere libera dalla morte del processo servito.

Ti consiglio di provare a controllare tutta la memoria impegnata prima e dopo scenari di interruzione anomali.

0

Solo se il sistema operativo non ripristina memoria al termine del programma. DOS e la sua "memoria adesiva" sono un esempio di tale sistema operativo. Nella maggior parte dei sistemi operativi moderni, la risoluzione anomala non è un problema.

+0

che tipo di memoria DOS non recupera al termine del programma? – unbeli

+0

Hrm. Sei sicuro che sia vero? – Gian

+0

Sono sicuro che sia vero per almeno una variante di MSDOS e BDOS di CP/M - avevano il supporto per quella che veniva chiamata "memoria appiccicosa" che un programma poteva allocare nello spazio e rimaneva allocata anche dopo la sua conclusione. Inoltre, la chiamata TSR in MSDOS ha ottenuto qualcosa di simile, ma non la considererei terminazione anomala. –

0

No, a meno che il programma non termini sempre in modo anomalo. :) Ad ogni modo, il sistema operativo fa un ottimo lavoro liberandolo. In effetti, molti programmatori pigri non si preoccupano nemmeno di liberare le cose con la terminazione normale - ma questo rende difficile individuare altre perdite di memoria (quelle che sono un vero problema).

3

Non è necessario il per recuperare la memoria alla terminazione normale eccetto per ovviare ai falsi positivi negli strumenti di rilevamento perdite.

Se il programma termina in modo anomalo, a seconda della causa, è possibile che si trovi che la memoria non sia disponibile nella memoria. Ad esempio, un SIGSEGV derivante da un heap corrotto significa che anche provare a liberare altre cose sullo heap potrebbe essere un esercizio senza speranza.

0

In caso di terminazione anomala, si desidera eseguire il minor numero possibile di elaborazione. Ridurre al minimo il bricolage con il processo di interruzione significa che puoi arrivare il più vicino possibile al motivo dell'aborto e qualsiasi ulteriore elaborazione può essere vista come "contaminante" del processo rendendo così più difficile il debug.

Problemi correlati