|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 15
|
[C ++] Problema di memoria con free()
Salve a tutti, mi siete sempre davvero molto utili e grazie a voi sono riuscito a realizzare un programma davvero figo.
Ho un nuovo problema: Ho creato uno struct e ho allocato la memoria con un malloc. Quando la rilascio con free, accade che non viene liberata TUTTA, ma viene liberata solo la prima cella. Vi riporto un frammento per farvi capire che la prima stampa va bene perchè visualizza i 3 elementi... mentre la seconda li rivisualizza dopo il rilascio della memoria. In teoria dovrebbero avere un valore casuale (infatti la prima cella va bene)... ma in pratica ciò non avviene e ogni volta che uso questa free, mi viene rilasciata solo la prima cella... tutte le altre rimangono con il loro contenuto. Codice:
struct lista { //definizione dello struct
int fattore; //solo un membro di tipo intero
};
int i;
struct lista * ListaPtr; //variabile di tipo puntatore allo struct
ListaPtr = malloc( 3*sizeof(struct lista) ); //alloco 3 celle
for (i=0; i<3; i++){
(ListaPtr+i)->fattore = i+10; //assegna 3 numeri consecutivi
printf("%d ", (ListaPtr+i)->fattore); //li stampa
}
free(ListaPtr); //rilascia la memoria (DOVREBBE!!!)
printf("\nMemoria liberata\n\n");
for (i=0; i<3; i++){
printf("%d ", (ListaPtr+i)->fattore); //stampa i due contenuti finali
}
Ho provato anche con questo comando: //free(ListaPtr+1); ma è come se non ci fosse... Ragazzi, questo è un problema grosso perchè nel mio programma ho messo un ciclo for che mi alloca memoria per tantissime celle... e rendersi conto che con free mi rilascia SOLO LA PRIMA... diventa un problema serio. Fatemi sapere grazie! |
|
|
|
|
|
#2 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
In C++ esistono gli operatori new e delete, che prima o poi dovrai comunque imparare a usare... Quote:
Per cui, dopo che hai chiamato free, tanto ListaPtr quanto i tre oggetti di tipo struct list allocati a partire da lì contengono i valori che avevi assegnato poco prima.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Quando fai una free liberi tutto il blocco di memoria. Il fatto che in memoria, in quelle locazioni, siano ancora fisicamente presenti alcuni dei dati che avevi messo .... è irrilevante. Quel blocco di memoria, dopo una free, non è più a tua disposizione. Una successiva malloc/calloc/ecc.... potrebbe benissimo riutilizzare quell'area di memoria. Comunque, ti segnalo che dovresti fare un cast del valore ritornato da malloc: ListaPtr = (struct lista*) malloc (......); e che invece di fare: (ListaPtr+i)->fattore potresti fare più semplicemente: ListaPtr[i].fattore
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#4 | ||
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 15
|
grazie ragazzi! Mi fido di voi!!! ;)
Perfetto ragazzi, allora ora sono molto più tranquillo!
Ci avevo pensato, infatti, che la memoria in effetti viene tutta rilasciata ma il contenuto fisicamente era rimasto... però mi sembrava troppo facile come motivazione! Ma se me lo dite voi che in quel modo la memoria è disponibile per nuove allocazioni... allora sono sicurissimo! Quote:
E poi volevo chiederti: ma se salvo il file ".c", posso utlizzare new e delete? Quote:
Hai ragione and, infatti nel programma vero e proprio i membri erano tutti puntatori a char o puntatori a int... quindi per accedere ai membri facevo (ListaPtr+i)->fattore . Ma nel caso che vi ho messo era giusto fare ListaPtr[i].fattore poichè il membro era int e non un *. Per quanto riguarda il cast... a cosa serve ListaPtr = (struct lista*) malloc (......); io ho sempre usato malloc senza niente davanti e tutti i miei programmi mi funzionano... a cosa serve quel cast? Il compilatore non mi segnala mai nessun tipo di errore... |
||
|
|
|
|
|
#5 | ||
|
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
Può darsi che, se trova un file .c, il compilatore lo tratti come un file C, ma preprocessi correttamente i commenti su una sola riga e simili... non saprei dire. Quote:
Ricorda che C e C++ non solo sono linguaggi diversi, ma nessuno dei due è un sottoinsieme dell'altro, ossia esistono alcuni programmi che sono validi in C ma non in C++.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
||
|
|
|
|
|
#6 | |||
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Ad esempio con il VC++, se vai nelle opzioni del progetto e imposti "Compila come codice C++", puoi anche mettere un sorgente .c e usare roba di C++. È comunque una buona cosa usare delle estensioni approriate e non ingannevoli (per l'utente, più che altro). Se lavori in "C" usa .c, se lavori in "C++" usa .cpp o .cxx o .cc (sebbene questi ultimi 2 li abbia sempre visti molto raramente!). Quote:
Se ListaPtr è un puntatore a struttura, dire (ListaPtr+i)-> oppure ListaPtr[i] è sostanzialmente la stessa cosa. Quote:
C/C++ sono linguaggi molto pignoli riguardo i tipi di dato. malloc() ritorna un void* mentre ListaPtr è un struct lista*. Quindi segnala un warning per il fatto che i tipi sono diversi (a meno che tu abbia "zittito" i warning, cosa comunque molto poco utile).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 07-02-2007 alle 17:02. |
|||
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 15
|
BOOOH
A regà... me state a rincojonì!
Io studio alla Sapienza di Roma, sto a ingegneria elettronica e per l'esame che ho fatto di informatica, il prof si è raccomandato di utilizzare il dev-c++ 4.9.9.2 e di salvare tutti i file in .c! Per l'esame occorreva progettare un programma che gestiva più file collegati... io l'ho fatto e ho salvato in .c perchè il prof diceva che .cpp non riconosceva le librerie che utilizzavamo (ad esempio non riconosceva manco l'istruzione system("pause")... morale della favola quello ci ha spiegato come usare sto dev-c++, io ho fatto come diceva, ho progettato il programma, ho fatto l'esame e m'ha messo pure trentaaaaa!!! Da paura! Lui l'ha visto e tutti i malloc li ho fatti senza quel cast! Anke a lezione o quando andavamo in laboratorio e usavamo il malloc, calloc, ... lui ci ha spiegato che bastava scrivere puntatore = malloc(...) Insomma... in poche parole ho preso trenta da uno che non capisce niente di informatica!!! hahahahahha, quindi non mi vale niente... che fregatura! |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Scusate eh...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#9 |
|
Junior Member
Iscritto dal: Nov 2006
Messaggi: 15
|
;)
hehehehehehhe, sono sempre professori
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Non per difendere il prof. ignorante, ma nel caso specifico, in C (ma non in C++) il cast della malloc() non è obbligatorio, e la sua assenza non dovrebbe generare alcun warning.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:31.



















