Re: problem with memory leaks



On Mon, Apr 03, 2006 at 03:19:25AM -0700, morph_in wrote:
> 
>    I am a newbie to GTK programming and cannot work out a simple problem ,so
> pls can some one inform abt the problem
> 
> GtkTextBuffer *tbuffer;
>     GtkTextIter start;
> 	GtkTextIter end;
> 	GtkWidget * textv = lookup_widget(GTK_WIDGET(menuitem), "textview1");
> 	tbuffer =gtk_text_view_get_buffer(textv);
> 	FILE *infile;
>     infile = fopen("/root/Desktop/a.s", "r");
>      if (infile)
>       {
>         char buffer[1024];
>         int nchars;
>         gchar *utf8;
>         while (1)
>           {
>             nchars = fread(buffer, 1, 1024, infile);
>             utf8 = g_locale_to_utf8(buffer, nchars, NULL, NULL, NULL);

This always allocates a new string...

>            if (!utf8)
>               { return;
>              }
>             gtk_text_buffer_get_end_iter(tbuffer, &end);
>             gtk_text_buffer_insert(tbuffer, &end, utf8, strlen(utf8));
> 
>             if (nchars < 1024)
>                 break;
>           }
>         fclose (infile);
> 		  free(utf8);

...so freeing it only once does not work.

Moreover, if the locale encoding is not single-byte (e.g.,
it is already UTF-8), this does not work because nothing
guarantees characters won't be split by the 1024-byte
boundaries.

Moreover, if the file is not really huge (and in that case
you would have other scalability problems with this code),
it is much better to use g_file_get_contents().

>       }
>     gtk_text_view_set_buffer(GTK_TEXT_VIEW(textv), tbuffer);

This is pointless, as tbuffer is still the same object as
before, that is, it is still the text buffer of textv.

> 		
> //g_free(tbuffer);                         //freeing any of them produces
> segmentation fault 
> 	 //g_free(textv);                   //and if i donot free them then i get a
> 15Kb leak 

References to objects are released with g_object_unref(),
please see some intro (the description is in a lot of
places, althout I cannot recommend any particular).

However, since this piece of code seems to *not* own any
reference to the objects, it should not release any either.

Yeti


--
That's enough.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]