Re: how to handle an array of Pixbuf?



You are right - this was a stupid mistake of mine:
the constructor does not copy the array, so the pointer ended up dangling.
(i probably assumed some magic from the Refptr ... ;) )

When i rewrote the constructor to copy the data from the array,
everything workled as expected.

Thank YOu again
  Jody


On Sat, Mar 2, 2013 at 10:31 AM, Kjell Ahlstedt
<kjell ahlstedt bredband net> wrote:
In the code snippet that you've shown, image2 is allocated on the stack.
Then of course it's deleted when the creating method is terminated. The
reference count of Gdk::Pixbuf is decreased, when Glib::RefPtr<Gdk::Pixbuf>
is deleted. If the reference count reaches 0, Gdk::Pixbuf is also deleted.
The next question is: How do you copy image2 in XMLSeq's constructor? If you
use memcpy() or a similar function, neither RefPtr's copy constructor nor
its assignment operator will be called. The reference count of Gdk::Pixbuf
is not increased as it should be when Glib::RefPtr<Gdk::Pixbuf> is copied.
And if you only copy a pointer to the array, you will have a dangling
pointer after the array has been deleted in the creating method.

If it works with std::vector, and you are satisfied with that, we need not
try to find out exactly what happened to your array, unless you're
interested.

2013-03-01 21:03, jody skrev:

I just passed the array to a constructor of an object who later draws
itself
     XLMSeq *pXLM3 = new XLMSeq(77, 1.0, 1, EAST, 3, image2);

in the constructor i copy the array 'image2' to the object's member
variable 'image2',
which is later used for drawing.

If i understand it correctly, by passing the pointer, the images were
deleted after the method which created them terminated?

But now I tried it  with a std::vector and that worked - thank you!
  jody

On Fri, Mar 1, 2013 at 8:30 PM, Kjell Ahlstedt
<kjell ahlstedt bredband net> wrote:

How do you transfer the array from the creating method to the painting
method? With arrays it's easy to (by mistake) copy a pointer to the array
when you should have copied the whole array. A std::vector is often
safer,

std::vector< Glib::RefPtr<Gdk::Pixbuf> > image2(3);

Kjell

2013-03-01 19:17, jody skrev:

Follow up:
when i fill the PixBuf array in the same method where i paint its
element this works...
Jody

On Fri, Mar 1, 2013 at 7:10 PM, jody <jody xha gmail com> wrote:

Hi

When i do
     Glib::RefPtr<Gdk::Pixbuf> image1 =
Gdk::Pixbuf::create_from_file("base1.png");

i can later (in a different method) paint this into a cairo context
like
this:
     Gdk::Cairo::set_source_pixbuf(cr, image1, 0, 0);


Now i wanted to do the same with an array of PixBufs:
      Glib::RefPtr<Gdk::Pixbuf> image2[3];
      image2[0] =  Gdk::Pixbuf::create_from_file("hexT1.png");
      image2[1] =  Gdk::Pixbuf::create_from_file("hexT2.png");
      image2[2] =  Gdk::Pixbuf::create_from_file("hexT3.png");
this compiles and seems to work, but painting (in a different method) :
      Gdk::Cairo::set_source_pixbuf(cr, image2[0], 0, 0);
fails with a segmentation fault.

I suspect that for some reason the RefPtr died, but i actually have no
idea.

Can anybody help me?

Thank You
    Jody

_______________________________________________




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