On Wed, 19 May 2004 08:43:49 +0900 Lyle Johnson <lyle / knology.net> wrote: > Yuri Leikind wrote: > > > When I need to delete some widget, I do it like this: > > > > parent_obj.removeChild(obj_to_remove) > > > > and then create and recalc > > > > But, though the object deleted does not belong anywhere in the hierarchy of GUI objects, > > it still exists. > > Correct. Calling removeChild() deletes the underlying C++ object. The > Ruby object that was referring to that C++ object is no longer in use, > but it hasn't been garbage-collected yet. > > > I have a ObjectSpace.each_object() loop in my program iterating over some > > of FXObjects, setting new font and text. Naturally, doing anything to a removed object > > causes error "This FXLabel (or FXWindow, or ...) * already released". > > Yes. Accessing a Ruby object whose C++ partner is gone is a no-no. > > > So, I have two questions: > > > > 1) Is there a way to find out whether the object has already been released? > > I don't guess so (it has never come up). If you were to add this request > to the list of FXRuby bugs at SourceForge, I might add a way to find out > this information in a future FXRuby release. > > > 2) What else must be done to the FoX object that we want to delete, besides > > parent_obj.removeChild(obj_to_remove) > > I guess you can try forcing the garbage collector to run immediately > after the call to removeChild(), i.e. > > parent.removeChild(child) > GC.start Perhaps some variable in my application (or in the FXRuby layer...) still points to the object, and GC.start doesn't help. I'll take a more thourough look now, as I see now where the problem might be. You've been very helpful, as usual, thank you. -- Best regards, Yuri Leikind