Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.
La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
che come avrete forse già capito el e matr sono 2 puntatori (precisamente puntatori a puntatori) che essendo di tipo diverso ma di stessa "categoria", vorrei liberare con la free_all senza doverla scrivere 2 volte (perchè mi scoccia )
pTR è un **void
ora volendo potrei pure modificare leggermente la free_all in modo da fare free di entrambe le memorie dei puntatori matr e el, ma dato che volevo capire meglio il funzionamento dei puntatori a void, mi chiedevo se quello fatto li fosse in qualche modo corretto, perchè mi dà dei warning
Ultima modifica di Blallo il gio 7 gen 2010, 13:18, modificato 1 volta in totale.
si scusa, volevo dire che è un puntatore a void
ma da quello che ho letto, un puntatore a void si può assegnare ad un puntatore di qualunque altro tipo
ciò nonostante mi da warning
non che sia un problema, ma vorrei solo capirne il funzionamento
jimmy_page_89 ha scritto:si scusa, volevo dire che è un puntatore a void
ma da quello che ho letto, un puntatore a void si può assegnare ad un puntatore di qualunque altro tipo
ciò nonostante mi da warning
non che sia un problema, ma vorrei solo capirne il funzionamento
Ti da il warning per l'assegnamento che fai? (pTR=el e pTR=matr).
C'è bisogno del casting a void,ho fatto delle semplici prove.
Il compilatore dealloca l'area di memoria,ma si dovrebbe creare un memory leak dovuto al fatto che non sa quanta memoria deallocare (poichè non fai il casting al tipo dei due puntatori.).
in codice(non ricordo la sintassi del C,quindi scrivo in C++):
la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]
"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]
Comunque concordo sul fatto che magari qualche riga di codice in più renderebbe più chiara la risoluzione del warning...
Io ho trovato qualcosa qui: http://it.wikipedia.org/wiki/Malloc (siccome programmo in C++ ed in C ho usato pochissimo l'allocazione dimanica della memoria).
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]
"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]
Vito ha scritto:
la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)
Ciao Vito,
non è così.
La delete conosce la memoria da liberare perché l'hai allocata con una malloc o simile, producendo una system call al sistema operativo che memorizza in una tabella inizio e dimensione della memoria che ti riserva. Quando allochi memoria dinamica richiedi un certo tot di byte. Al limite se vuoi una soluzione portabile che allochi 5 oggetti di un certo tipo usi sizeof.
Vito ha scritto:
la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)
Ciao Vito,
non è così.
La delete conosce la memoria da liberare perché l'hai allocata con una malloc o simile, producendo una system call al sistema operativo che memorizza in una tabella inizio e dimensione della memoria che ti riserva. Quando allochi memoria dinamica richiedi un certo tot di byte. Al limite se vuoi una soluzione portabile che allochi 5 oggetti di un certo tipo usi sizeof.
Il casting non c'entra assolutamente nulla.
Sisi,rileggendo un po' di cose su malloc e free mi sono reso conto di aver detto una cosa non giusta,grazie per la dritta.
P.S. Ma ti riferivi alla free?
Perchè con la delete ho bisogno di fare il casting..(ho puntatore a void con il quale alloco un vettore di interi,quando voglio liberare la memoria se non faccio il casting mi restituisce un warning).
"Stat rosa pristina nomina, nomina nuda tenemus." [ Umberto Eco - Il nome della rosa]
"Faber est suae quisque fortunae ." [ Appio Claudio Cieco]
Sì Vito,
mi riferivo alla free.
La free è legata a malloc, dove dichiari il numero di byte che ti servono e ti restituisce un puntatore void verso la memoria allocata (perciò per usarlo devi fare un cast).
La new del C++ funziona in maniera diversa, come tu sai. Ad esempio