Newsgroup: it.comp.os.linux.development
Titolo: Problema con free()

 
          Ciao a tutti.
Ho un problema con una applicazione gnome che sto sviluppando, forse legato
a nuove versioni di librerie installate (libc6 ?).
Veniamo al punto: il programma ha funzionato correttamente fino a quando
sulla mia debina testing/unstable non ho aggiornato gnomebaker, che mi ha
tirato dentro un po di aggiornamenti di librerie gnome...
Adesso ottengo dalla mia applicazione un errore di invalid pointer in
seguito a una chiamata di free() a un puntatore di una pixmap, anche se tale
puntatore non è NULL.
Su un altro computer, con diverse versioni di librerie (ma sempre debian
testing) continua a funzionare correttamente tutto, e tra l'altro, quella
non è l'unica chiamata di free che faccio nel programma!
Su google non ho trovato suggerimenti utili, putroppo, e spero di essermi
rivolto al newsgroup giusto!
Cippa Lippa
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 rivolto al newsgroup giusto!
se invece di free utilizzi free-pixmap?

> rivolto al newsgroup giusto!
l'ho letto qua, digitando su google free pixmap, era il primo risultato
http://www.labri.fr/perso/strandh/Teaching/MTP/Common/CLX-man/4_8_Pixmaps.html

 puntatore non è NULL.
"invalid" non vuol dire "nullo" (del resto, free(NULL) e' una
istruzione perfettamente valida secondo lo Standard, che non causa
azione alcuna).  evidentemente le nuove librerie hanno portato alla
luce qualche bug del tuo programma (tipo scrittura involontaria in
posti sbagliati dell'arena che corrompono l'heap, chiamata di free due
volte sullo stesso pointer, ...).  debugga.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg


Scusa, ho dimenticato di specificare che il linguaggio che utilizzo è il C.
Non ho per ora trovato riferimenti a una funzione free-pixmap nelle api di
gdk...resta comunque il fatto che prima di un aggiornamento di alcune
librerie il programma funzionava senza problemi...
grazie comunque per la risposta!


 puntatore non  NULL.
Ciao,
non so essere molto preciso, ma nell'ultima versione di gdk/gtk hanno
cambiato il metodo di allocazione della memoria.
Anche evolution da` parecchie rogne, per esempio, e il workaround e` di
mettere
G_SLICE=always-malloc
prima di lanciarlo.
Probabilmente il tuo errore e` correlato. Prova a chiedere sulla ml di
gtk (o vedere gli archivi) se devi cambiare gestione della memoria con
le nuove librerie.
Io le gtk le uso solo in Python, quindi non so essere piu` preciso.
Bye.
-- 
Alessandro Pellizzari

Cippa Lippa wrote:

Sono d'accordo con Alessandro, le nuove librerie GTK usano una gestione
interna delle allocazioni, simile a quella nell'interpreta Java (mi pare
sia GAllocator e sta nelle glib), quindi tutto cio` che allochi dalle glib
in poi (quindi gdk gtk gdkpixbuf e altri) devi liberarli con le funzioni
apposite.
ciao!
-- 
daniele_athome

 prima di lanciarlo.
Questo risolve la situazione, grazie mille!!
Ora cerchero' di capire come risolvere sistematicamente la situazione!!


 gdk...
Ti prego, dimmi che *non* stai usando free() con una GdkPixmap/GdkPixbuf.
Davvero, ti prego.
Perche' altrimenti meriti tutto il male di questo mondo per non aver
letto la API reference.
Ciao,
 Emmanuele.

 puntatore non è NULL.
Se stai usando le GTK (come inferisco dal fatto che cambiando le GTK ha
smesso di funzionare tutto), allora non devi *mai* usare la free() su
memoria allocata dalle librerie della famiglia; le GTK usano memory pool
per allocare efficientemente la memoria - ergo, devi usare le funzioni
di free che ti mettono a disposizione. As esempio: g_new() -> g_free();
g_object_new() -> g_object_unref(); etc.
Ciao,
 Emmanuele.

Emmanuele Bassi wrote:

LOL
-- 
daniele_athome

                    Il 06 Apr 2006, 02:44, Emmanuele Bassi <zef...@rogue.local.invalid> ha
scritto:

Merito, merito, purtroppo!!! :(
Comunque, una velocissima lettura del gtk 2.0 tutorial, e in particolare uno
sguardo al codice di scribble mi ha illuminato: devo usare
g_object_unref()...
Mi cospargo il capo di cenere e chiedo umilmente perdono!


 g_object_unref()...
Qui non serve il tutorial, qui servono le cose serie:
 
http://developer.gnome.org/doc/API/2.0/glib/
 
http://developer.gnome.org/doc/API/2.0/gobject/
 
http://developer.gnome.org/doc/API/2.0/gtk/
 
http://developer.gnome.org/doc/API/2.0/gdk/
 
http://developer.gnome.org/doc/API/2.0/gdk-pixbuf/
Vai, fratello, e non peccare piu'.
Ciao,
 Emmanuele.

 
lol ;)
-- 
daniele_athome