So I have an applications I support that has been randomly crashing, but is also stuck at an old Ruby and Ruby/Gnome2 build. But my question should bypass that with "how should I do this, regardless of versions"  My question is, basically, good form to destroy things you create, or rely on the garbage collector? Here's the SegV problem I am having...


 So in my case, I am doing the following(yes, I know Canvas is depricated but this could apply to any GUI thing you do a signal_connect on.

spanPoly = Gnome::CanvasPolygon.new(…)

spanPoly.signal_connect('event') do |item, event|

…

end


Ruby "randomly" is  Seg Faulting with the following, (it does produce a very non helpful core file).


somefile.rb:558: warning: instance variable holder not initialized

somefile.rb:558: [BUG] Segmentation fault

The line 558 is the signal_connect line above. I add those objects to an array, and updated a view. At times they are destroyed. 

My guess at what is happening, is I have destroyed the object. But something is causing that signal_connect handler to run, but crashes Ruby, as its been destroyed. The "instance variable holder not initialized" is a clue to me I think.


In my code, should I really try to do a "signal_handler_disconnect" for that action before I destroy it? Like

Create it like this:

spanPoly = Gnome::CanvasPolygon.new(…)

spanPolyEventId = spanPoly.signal_connect('event') do |item, event|

…

end

 

Destroy it like this:

spanPoly.signal_handler_disconnect(spanPolyEventId)

spanPoly.destroy()



Is this maybe just good form? Trying to explicitly delete what you have "newed".


Thanks