<div dir="ltr">I think I recently found a similar problem on OS X (in 4.8 I should add), where we were getting events coming through for cocoa objects that had their corresponding QWidget deleted. In my case I was getting an "NSFlagsChanged" event, which would then try and send the event to the QWindow, but it had been set to NULL. This seemed to only be happening on Yosemite machines, but that might be a coincidence.<div><br></div><div>To patch this particular case, I added a macEventFilter to check for this specific problem, maybe it'd be of use to you?</div><div><br></div><div><p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(187,44,162)">bool</p>
<p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(79,129,135)">MyApplication<span style="color:rgb(0,0,0)">::macEventFilter(</span>EventHandlerCallRef<span style="color:rgb(0,0,0)"> caller, </span>EventRef<span style="color:rgb(0,0,0)"> event)</span></p>
<p style="margin:0px;font-size:11px;font-family:Menlo">{</p></div><span style="font-family:Menlo;font-size:11px;white-space:pre">   </span><span style="color:rgb(187,44,162);font-family:Menlo;font-size:11px">@try</span><span style="font-family:Menlo;font-size:11px;color:rgb(0,0,0)"> {</span><br><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">  </span><span style="font-family:Menlo;font-size:11px;white-space:pre">    </span><span style="font-family:Menlo;font-size:11px;color:rgb(187,44,162)">const</span><span style="font-family:Menlo;font-size:11px"> </span><span style="font-family:Menlo;font-size:11px;color:rgb(112,61,170)">NSEvent</span><span style="font-family:Menlo;font-size:11px">*</span><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">       </span><span style="font-family:Menlo;font-size:11px">cocoaEvent</span><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">   </span><span style="font-family:Menlo;font-size:11px">= </span><span style="font-family:Menlo;font-size:11px;color:rgb(187,44,162)">reinterpret_cast</span><span style="font-family:Menlo;font-size:11px"><</span><span style="font-family:Menlo;font-size:11px;color:rgb(187,44,162)">const</span><span style="font-family:Menlo;font-size:11px"> </span><span style="font-family:Menlo;font-size:11px;color:rgb(112,61,170)">NSEvent</span><span style="font-family:Menlo;font-size:11px"> *>(event);</span><br><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">                </span><span style="font-family:Menlo;font-size:11px;color:rgb(112,61,170)">NSEventType</span><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">    </span><span style="font-family:Menlo;font-size:11px">cocoaEventType</span><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">       </span><span style="font-family:Menlo;font-size:11px">= [ cocoaEvent </span><span style="font-family:Menlo;font-size:11px;color:rgb(61,29,129)">type</span><span style="font-family:Menlo;font-size:11px"> ];</span><br><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">                </span><span style="font-family:Menlo;font-size:11px;color:rgb(112,61,170)">NSUInteger</span><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">     </span><span style="font-family:Menlo;font-size:11px">cocoaModifiers</span><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">       </span><span style="font-family:Menlo;font-size:11px">= [ cocoaEvent </span><span style="font-family:Menlo;font-size:11px;color:rgb(61,29,129)">modifierFlags</span><span style="font-family:Menlo;font-size:11px"> ];</span><br><span style="white-space:pre;font-family:Menlo;font-size:11px">  </span><br><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">       </span><span style="font-family:Menlo;font-size:11px;white-space:pre">    </span><span style="font-family:Menlo;font-size:11px;color:rgb(187,44,162)">if</span><span style="font-family:Menlo;font-size:11px"> ( cocoaEventType == </span><span style="font-family:Menlo;font-size:11px;color:rgb(61,29,129)">NSFlagsChanged</span><span style="font-family:Menlo;font-size:11px"> )<br></span><div><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">          </span><span style="font-family:Menlo;font-size:11px">{</span><br><span style="font-family:Menlo;font-size:11px;white-space:pre">     </span><span style="font-family:Menlo;font-size:11px;color:rgb(0,0,0)"><span class="" style="white-space:pre">          </span></span><span style="color:rgb(0,132,0);font-family:Menlo;font-size:11px">// This is an on quit Qt bug, where we seem to be getting an NSFlagsChanged on shutdown.</span></div><div><span style="font-family:Menlo;font-size:11px;color:rgb(0,0,0)"><span class="" style="white-space:pre">       </span></span><span style="font-family:Menlo;font-size:11px;white-space:pre">       </span><span style="font-family:Menlo;font-size:11px;color:rgb(0,0,0)"><span class="" style="white-space:pre">  </span></span><span style="color:rgb(0,132,0);font-family:Menlo;font-size:11px">// The problem with this is that Qt tries to send the event to the NSWindow's widget, but</span></div><div><span style="font-family:Menlo;font-size:11px;color:rgb(0,0,0)"><span class="" style="white-space:pre">          </span></span><span style="font-family:Menlo;font-size:11px;white-space:pre">       </span><span style="color:rgb(0,132,0);font-family:Menlo;font-size:11px">// that's already been destroyed, so causes a null ptr exception.</span></div><div><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">                      </span><span style="font-family:Menlo;font-size:11px;color:rgb(112,61,170)">NSWindow</span><span style="font-family:Menlo;font-size:11px">* window = [cocoaEvent </span><span style="font-family:Menlo;font-size:11px;color:rgb(61,29,129)">window</span><span style="font-family:Menlo;font-size:11px">];</span><br><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">     </span><span style="font-family:Menlo;font-size:11px;white-space:pre">    </span><span class="" style="font-family:Menlo;font-size:11px;white-space:pre"> </span><span style="font-family:Menlo;font-size:11px;color:rgb(79,129,135)">QWidget</span><span style="font-family:Menlo;font-size:11px">* widget = (QWidget*)[window </span><span style="font-family:Menlo;font-size:11px;color:rgb(120,73,42)">QT_MANGLE_NAMESPACE</span><span style="font-family:Menlo;font-size:11px">(qt_qwidget)];</span></div><div><br><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">                        </span><span style="font-family:Menlo;font-size:11px;color:rgb(187,44,162)">return</span><span style="font-family:Menlo;font-size:11px"> (widget == </span><span style="font-family:Menlo;font-size:11px;color:rgb(187,44,162)">NULL</span><span style="font-family:Menlo;font-size:11px">);</span><br><span class="" style="font-family:Menlo;font-size:11px;white-space:pre">   </span><span style="font-family:Menlo;font-size:11px;white-space:pre">    </span><span style="font-family:Menlo;font-size:11px">}</span></div><div><span style="font-family:Menlo;font-size:11px;white-space:pre">        </span><span style="font-family:Menlo;font-size:11px">}</span><br><span style="font-family:Menlo;font-size:11px;white-space:pre">     </span><span style="font-family:Menlo;font-size:11px;color:rgb(187,44,162)">@catch</span><span style="font-family:Menlo;font-size:11px"> ( NSException* )</span><br><span style="font-family:Menlo;font-size:11px;white-space:pre">     </span><span style="font-family:Menlo;font-size:11px">{</span><br><span style="font-family:Menlo;font-size:11px;white-space:pre">     </span><span style="font-family:Menlo;font-size:11px;color:rgb(0,0,0)"><span class="" style="white-space:pre">  </span></span><span style="color:rgb(0,132,0);font-family:Menlo;font-size:11px">// do nothing</span><br><div><p style="margin:0px;font-size:11px;font-family:Menlo"><span style="white-space:pre">        </span>}</p></div><div>














<p style="margin:0px;font-size:11px;font-family:Menlo;min-height:13px"><span class="" style="white-space:pre">                </span></p><p style="margin:0px;font-size:11px;font-family:Menlo;color:rgb(187,44,162)"><span style="white-space:pre;color:rgb(34,34,34)">  </span>return<span style="color:rgb(0,0,0)"> </span>false<span style="color:rgb(0,0,0)">;</span></p><p style="margin:0px;font-size:11px;font-family:Menlo">





</p><p style="margin:0px;font-size:11px;font-family:Menlo">}</p></div><div><br></div><div><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 6, 2015 at 2:22 PM, René J.V. <span dir="ltr"><<a href="mailto:rjvbertin@gmail.com" target="_blank">rjvbertin@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Tuesday January 06 2015 13:07:02 David Faure wrote:<br>
<br>
</span>Let's make something clear if it wasn't already: this concerns Qt4.8 . I have no way of knowing at this point if a similar issue will occur in Qt5.<br>
Let me also add that I cannot be certain at this time that using obj-deleteLater() instead of delete obj will prevent the issue from happening.<br>
<br>
For my personal education: is it correct that the C++ delete operator is always immediate and irrevocable in the sense that the target object's dtor cannot prevent deletion to take place nor postpone it?<br>
<span class=""><br>
>It's wrong because it's fixing the symptom (null d pointer) instead of fixing<br>
>the cause (using an action that was already deleted).<br>
<br>
</span>Indeed, I never intended it to be more than a workaround fix (and possible means to help find the underlying cause) rather than an elegant solution.<br>
<br>
Anyway, we seem to have a diagnosis, which would lead to the conclusion that the bug is in Qt, somewhere between macUpdateMenuBarImmediatly and qt_mac_set_modal_state_helper_recursive which should know that the QAction they're trying to use has been deleted.<br>
<br>
If we stop at that diagnosis instead of figuring out why this deviant behaviour occurs, a few questions arise that aren't without interest, IMHO.<br>
<br>
I think that it implies that some part of the documentation should read "objects corresponding to UI elements can be deleted using C++ delete in the thread where they were created, except on OS X where this could lead to exposure of bugs in Qt's Cocoa event handling, and where they should be released by calling the deleteLater() method".<br>
<br>
Of course the documentation could also make a strong point to use deleteLater() always for that kind of objects (could be through a macro of course). I can only speak out of experience with KDE and its community, but at this point my impression is that people there mostly know (care?) about Linux and possibly MS Windows, and arguing why they'd need to use deleteLater can be difficult esp. when you don't have hard proof.<br>
<br>
The alternative would be to modify Qt's Cocoa-specific event handling mechanism, even if it's only to catch access to deleted objects through exception handling, either to pretend nothing just happened, or combined with a kind of registry of deleted objects that is maintained by the event loop so that the developer can at least trace back which object should be released through deleteLater.<br>
<br>
I'd actually be interested to see how well that kind of an approach would work to debug this and similar issues I have at hand, if someone can give me some guidance. I'm thinking of a registry stored in wherever deleteLater also stores the information required to delete an object at the appropriate time (so that the registry can be flushed at that point) and a modification to the QObject or QWidget dtor to store the this ptr in said registry.<br>
On the other end, I'm thinking for now of a case-by-case protection using traditional signal trapping and handling (combined with setjmp/longjmp) rather than C++ exceptions. I've used that approach before, and on i386 it give very little overhead IIRC. ObjC exceptions could also be used, where feasible.<br>
<br>
Thanks,<br>
René<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
Interest mailing list<br>
<a href="mailto:Interest@qt-project.org">Interest@qt-project.org</a><br>
<a href="http://lists.qt-project.org/mailman/listinfo/interest" target="_blank">http://lists.qt-project.org/mailman/listinfo/interest</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><span style="color:rgb(102,102,102)">Tom Ward</span><br style="color:rgb(102,102,102)"><span style="color:rgb(102,102,102)">The Foundry,</span><br style="color:rgb(102,102,102)"><font color="#666666">5 Golden Square, London, W1F 9HT</font><br style="color:rgb(102,102,102)"><font color="#666666">Tel: +44(0) 20 7479 4350   Web: </font><a style="color:rgb(102,102,102)" href="http://www.thefoundry.co.uk" target="_blank">www.thefoundry.co.uk</a><br style="color:rgb(102,102,102)"><br style="color:rgb(102,102,102)"><span style="color:rgb(102,102,102)">The Foundry Visionmongers Ltd.</span><br style="color:rgb(102,102,102)"><span style="color:rgb(102,102,102)">Registered in England and Wales No: 4642027</span><br></div></div>
</div>