PDA

Visualizza la versione completa : [c] conoscere se un puntatore ad una struct punta ancora alla struct


xnavigator
11-06-2009, 23:23
ragazzi ho un certo codice in cui vengono allocate dinamicamente alcune struct....

durante l'esecuzione del codice può essere che queste struct vengono deallocate (usando free)

posso sapere durante l'esecuzione se il puntatore che puntava ad una di queste struct, punta ancora ad una struct valida (cioè su cui non è stata usata la funzione free() )?

thx

xnavigator
11-06-2009, 23:27
pensandoci potrei confrontare la sizeof puntanta dal mio puntatore con la sizeof della mia struct "costante" (il cui valore è 8 tra l'altro)

cioè potrei fare cosi


if ( sizeof(*myPtrToStruct)!=sizeof(struct mystruct) )
//> puntatore deallocato con free


che ne dite?

shodan
12-06-2009, 00:00
Se deallochi il puntatore alla struttura con free(), nell'istruzione successiva settalo a NULL.

oregon
12-06-2009, 00:05
Segui l'indicazione di shodan e non fare quel confronto con il sizeof ...

xnavigator
12-06-2009, 00:46
e si avevo pensato anche io a quelllo il problema è che dealloco le struct in una funzione e ho il puntatore a questa struct da un'altra parte...

dovrei passare il puntatore che punta a quel puntatore alla funzione per farlo settare a NULL nel caso di deallocazioni (non so neanche se posso passare il puntatore ad un variabile puntatore, ma penso di si)

YuYevon
12-06-2009, 00:48
Tra l'altro, annullando il puntatore con dopo la free() eviti anche il problema di una seconda free() accidentale: infatti se provi a deallocare lo spazio in memoria due volte per lo stesso puntatore hai un errore run-time sulla seconda deallocazione mentre invece, se dopo la prima annulli il puntatore, anche un'eventuale seconda free() "accidentale" non ti darebbe problemi perché equivarrebbe a fare free(NULL) che non comporterebbe nessun errore run-time.

EDIT: (visto dopo)



(non so neanche se posso passare il puntatore ad un variabile puntatore, ma penso di si)


Certo che puoi... ed è proprio quello che devi fare in questo caso.

Loading