Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 07-02-2007, 04:10   #1
ugo86
Junior Member
 
L'Avatar di ugo86
 
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!
ugo86 è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2007, 09:58   #2
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da ugo86
Ho creato uno struct e ho allocato la memoria con un malloc.
malloc e free sono tipiche del C, non del C++.
In C++ esistono gli operatori new e delete, che prima o poi dovrai comunque imparare a usare...
Quote:
ogni volta che uso questa free, mi viene rilasciata solo la prima cella... tutte le altre rimangono con il loro contenuto.
free rende disponibile la memoria, ma non cambia il valore dei puntatori ad essa, e nemmeno modifica il contenuto della memoria puntata.
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" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2007, 10:09   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ugo86
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.
Alt ... hai allocato un blocco di memoria che contiene 3 elementi di tipo struct lista.
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%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2007, 16:06   #4
ugo86
Junior Member
 
L'Avatar di ugo86
 
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:
Originariamente inviato da Ziosilvio
malloc e free sono tipiche del C, non del C++.
In C++ esistono gli operatori new e delete, che prima o poi dovrai comunque imparare a usare...
Volevo dirti che io il file lo salvo sempre con estensione ".c" quindi (dall'idea che mi sono fatto) utilizzo il c++ come interfaccia ma programmo con il c... giusto???
E poi volevo chiederti: ma se salvo il file ".c", posso utlizzare new e delete?

Quote:
Originariamente inviato da andbin
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

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...
ugo86 è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2007, 16:21   #5
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da ugo86
io il file lo salvo sempre con estensione ".c" quindi (dall'idea che mi sono fatto) utilizzo il c++ come interfaccia ma programmo con il c... giusto?
Dipende dal compilatore e dalle sue impostazioni.
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:
se salvo il file ".c", posso utlizzare new e delete?
Probabilmente no, perché in C new e delete non esistono.
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" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 07-02-2007, 16:27   #6
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ugo86
Volevo dirti che io il file lo salvo sempre con estensione ".c" quindi (dall'idea che mi sono fatto) utilizzo il c++ come interfaccia ma programmo con il c... giusto???
E poi volevo chiederti: ma se salvo il file ".c", posso utlizzare new e delete?
Dipende dal compilatore/ambiente di sviluppo. Alcuni potrebbero basarsi sull'estensione per stabilire come compilare il sorgente, altri compilano il sorgente in base a quanto configurato nelle proprietà del progetto o a delle opzioni specifiche.
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:
Originariamente inviato da ugo86
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 *.
Guarda che c'entra poco se il membro è un int o un puntatore.
Se ListaPtr è un puntatore a struttura, dire (ListaPtr+i)-> oppure ListaPtr[i] è sostanzialmente la stessa cosa.

Quote:
Originariamente inviato da ugo86
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...
Al massimo segnala un warning, non un errore.
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.
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2007, 00:42   #7
ugo86
Junior Member
 
L'Avatar di ugo86
 
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!
ugo86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2007, 11:35   #8
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da ugo86
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!!!
Che tristezza 'sti prof ....
Scusate eh...
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2007, 18:11   #9
ugo86
Junior Member
 
L'Avatar di ugo86
 
Iscritto dal: Nov 2006
Messaggi: 15
;)

hehehehehehhe, sono sempre professori
ugo86 è offline   Rispondi citando il messaggio o parte di esso
Old 08-02-2007, 18:49   #10
Qu@ker
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.
Qu@ker è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
Superati 13.300 MT/s per DDR5: ad ASUS e...
L’evoluzione dell’IA nelle imprese: la v...
Le storie in evidenza di Instagram torna...
Addio GeForce RTX 5060 e Radeon RX 9060?...
Arriva Hisense Déco TV S5Q, estet...
Aggiornata TOP500, la classifica degli H...
Noctua NH-D15 Chromax.black è rea...
NVIDIA aggiorna DGX Spark: nuovo kernel,...
Con Work IQ, Copilot per Microsoft 365 i...
Azure Cobalt 200: svelata la nuova CPU A...
Intel a tutto tondo: tra processi in ram...
AMD FSR Redstone arriverà ufficia...
L'Olanda 'cede' alla Cina: retromarcia t...
Stagione 1 al via: tutte le novità...
TikTok rafforza trasparenza e benessere ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:31.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v