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
<[email protected]> 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
>> <[email protected]> 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 <[email protected]> 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
>>>>
>>>> _______________________________________________
>>>>
>
_______________________________________________
gtkmm-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gtkmm-list

Reply via email to