()
Newbie
Messaggi:
Iscritto:
|
Salve, vorrei sapere la giusta procedura per il seguente problema:
ho una struttura di char * (puntatori per recepire stringhe)
Codice sorgente - presumibilmente C++ |
struct prova{ char *uno; char *due; char *tre; }provina;
|
devo allocare della memoria per creare le strutture che mi servono,
La procedura che penso sia giusta e':
Codice sorgente - presumibilmente Plain Text |
malloc(struct prova);
malloc(uno);
malloc(due);
malloc(tre);
/* e poi a fine funzione */
free(prova);
|
mi chiedevo se la malloc per la struttura deve essere fatta prima o dopo le singole malloc dei puntatori
e se una free (prova) basta pure per i puntatori interni alla struttura, oppure è bene operare una free() per singolo puntatore?
p.s. non tenete conto molto della sintassi delle istruzioni che ho scritto, mi interessa capire il concetto.
grazie a tutti per l'aiuto.
Ultima modifica effettuata da il 13/02/2016 alle 17:56 |
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
La struttura dichiarata in quel modo è gia dichiarata e allocata con il nome provina, per tanto non serve allocare altro spazio per essa.
Codice sorgente - presumibilmente C++ |
typedef struct{ char *uno; char *due; char *tre; }prova;
|
A questo punto prova è diventato un tipo, per tanto posso gestirla come preferisco
Codice sorgente - presumibilmente Plain Text |
prova* a;
a = (prova*) malloc(sizeof(prova));
|
Per quanto riguarda i puntatori interni per ognuno dovrò eseguire l'allocazione dinamica mediante malloc.
Codice sorgente - presumibilmente Plain Text |
provina.uno = (char*) malloc(n);
|
Il free va effettuato su ogni singolo puntatore all'heap, visto che C non implementa un GC. |
|
()
Newbie
Messaggi:
Iscritto:
|
Grazie!! oggi appena posso provo!
|
|
()
Newbie
Messaggi:
Iscritto:
|
Postato originariamente da Mikelius:
Grazie!! oggi appena posso provo! |
mi è successo un errore, se prima dealloco la memoria della struttura e dopo quella dei singoli puntatori ,
Se invece dealloco la memoria per i singoli puntatori e dopo quella per la struttura , tuttto ok (sembra)
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Ovviamente, se de allochi la struttura non hai più i riferimenti alle stringhe in essa contenute. Ma hai proprio necessità di usare la memoria dinamica anche per la struttura?
|
|
Template (Member)
Pro
Messaggi: 177
Iscritto: 09/12/2015
|
È normale che ti compaia quell'errore, perchè quello che hai fatto non ha senso...
Quando usi la funzione free() su un dato, tu liberi la memoria precedentemente occupata da quel dato.
Questo vuol dire che, con l'istruzione:
Codice sorgente - presumibilmente Plain Text |
Tu hai liberato la memoria occupata dalla struct, e cioè (più o meno) la memoria occupata dai tre puntatori che hai dichiarato... ora, ti rimane da liberare la memoria a cui i tre puntatori dentro la struct puntavano, ed è per questo che va chiamata una free() per ogni puntatore come ti ha detto Roby94. Ma, se tu ora scrivi:
Codice sorgente - presumibilmente Plain Text |
Di fatto scrivi una cosa priva di senso: cerchi di deallocare della memoria effettivamente deallocabile, e questo va bene, ma lo vuoi fare utilizzando per identificarla un puntatore che non esiste più, perchè l'hai già deallocato con la prima istruzione.
Questo è il motivo per cui va deallocata prima la memoria cui si riferiscono i puntatori, e solo dopo quella occupata dai puntatori stessi: perchè, altrimenti, ti ritroveresti con della memoria effettivamente irraggiungibile (avendo tu "cancellato" i puntatori che ti permettevano di raggiungerla). |
|
()
Newbie
Messaggi:
Iscritto:
|
Postato originariamente da Template:
È normale che ti compaia quell'errore, perchè quello che hai fatto non ha senso...
Quando usi la funzione free() su un dato, tu liberi la memoria precedentemente occupata da quel dato.
Questo vuol dire che, con l'istruzione:
Codice sorgente - presumibilmente Plain Text |
Tu hai liberato la memoria occupata dalla struct, e cioè (più o meno) la memoria occupata dai tre puntatori che hai dichiarato... ora, ti rimane da liberare la memoria a cui i tre puntatori dentro la struct puntavano, ed è per questo che va chiamata una free() per ogni puntatore come ti ha detto Roby94. Ma, se tu ora scrivi:
Codice sorgente - presumibilmente Plain Text |
Di fatto scrivi una cosa priva di senso: cerchi di deallocare della memoria effettivamente deallocabile, e questo va bene, ma lo vuoi fare utilizzando per identificarla un puntatore che non esiste più, perchè l'hai già deallocato con la prima istruzione.
Questo è il motivo per cui va deallocata prima la memoria cui si riferiscono i puntatori, e solo dopo quella occupata dai puntatori stessi: perchè, altrimenti, ti ritroveresti con della memoria effettivamente irraggiungibile (avendo tu "cancellato" i puntatori che ti permettevano di raggiungerla). |
Questo era il mio dilemma principale... se deallocando la memoria per la struttura, in automatico si deallocasse pure quella dei singoli campi... ho messo le istruzioni nel giusto ordine |
|
Template (Member)
Pro
Messaggi: 177
Iscritto: 09/12/2015
|
Postato originariamente da Mikelius:
Questo era il mio dilemma principale... se deallocando la memoria per la struttura, in automatico si deallocasse pure quella dei singoli campi |
L'allocazione dinamica avviene nell'heap, che è una porzione di memoria di solito non gestita dai sistemi operativi e dunque a totale carico delle applicazioni che la impiegano.
Alcuni linguaggi implementano un sistema di Garbage Collection che si occupa, tra le altre cose, di liberare automaticamente la memoria heap... in C, un sistema del genere non esiste, e dunque la gestione dell'heap è a pieno carico del programmatore. |
|
()
Newbie
Messaggi:
Iscritto:
|
Postato originariamente da Template:
L'allocazione dinamica avviene nell'heap, che è una porzione di memoria di solito non gestita dai sistemi operativi e dunque a totale carico delle applicazioni che la impiegano.
Alcuni linguaggi implementano un sistema di Garbage Collection che si occupa, tra le altre cose, di liberare automaticamente la memoria heap... in C, un sistema del genere non esiste, e dunque la gestione dell'heap è a pieno carico del programmatore. |
in c++ e java mi pare sia cosi, grazie per le info. |
|