<div><div style="color: rgb(0, 0, 0); font-family: arial; font-size: 14px;"><span style="line-height: 23.7999992370605px;">> 2)In the doc of sip.setdestroyonexit(destroy) says, "Calling this function with a value of False disables the automatic destruction of C++ instances and C structures(owned by Python)." ,then which is responsible for destroying these C++ instances and C structures? the dtor of them ?</span><br style="line-height: 23.7999992370605px;"><br style="line-height: 23.7999992370605px;"><span style="line-height: 23.7999992370605px;">The destructors will never be called in that case - which *usually*</span><br style="line-height: 23.7999992370605px;"><span style="line-height: 23.7999992370605px;">isn't an issue, because the application is exiting anyways.</span><br style="line-height: 23.7999992370605px;"></div><div>----------------------------------------------------------------------------------------------------------------------------------</div><div>1)Then on application existing ,who destroys them ?</div><div><br></div><div><br></div><div>2)if we solve the problem via sip.setdestroyonexit(False), then I tested that the system tray icon doesn't disappear right away as application exists .</div><div><a href="http://www.riverbankcomputing.com/pipermail/pyqt/2015-March/035730.html" _src="http://www.riverbankcomputing.com/pipermail/pyqt/2015-March/035730.html">http://www.riverbankcomputing.com/pipermail/pyqt/2015-March/035730.html</a> </div><div><br></div><div style="color: rgb(0, 0, 0); font-family: arial; font-size: 14px;"><br></div><div style="color: rgb(0, 0, 0); font-family: arial; font-size: 14px;"><br></div><div style="color: rgb(0, 0, 0); font-family: arial; font-size: 14px;"><br></div></div><!-- jy5ContentSuffix --><div>在2015年04月01 15时03分, "Florian Bruhin"<me@the-compiler.org>写道:</div><blockquote id="isReplyContent" style="padding-left:1ex; margin: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><br>Hi,<br><br>(note: I'm not 100% sure about my answers - so if I'm wrong somewhere,<br>someone please correct me!)<br><br>* redstone-cold <<a href="mailto:redstone-cold@163.com">redstone-cold@163.com</a>> [2015-04-01 14:32:19 +0800]:<br>> How do you know the crash happens in QObject::thread()?<br><br>(I got this off-list, but I'm answering here as well)<br><br>There are two approaches to get more info (i.e. a C++ stacktrace) when<br>debugging segfaults:<br><br>- Prepending the commandline with 'catchsegv'. This is very easy, but<br>  will print mangled C++ symbols like _ZNK7QObject6threadEv which you<br>  need to decode via c++filt or http://demangler.com/<br><br>- Running it inside gdb, usually with something like:<br><br>  gdb /usr/bin/python3.4 -ex run<br><br>  And then using 'bt' to get a backtrace when the segfault happens.<br><br>> sip.setdestroyonexit(False) is the default with PyQt5 ?How do you<br>> know this ? <br><br>I don't know where I originally picked it up, but it's listed here:<br><br>http://pyqt.sourceforge.net/Docs/PyQt5/pyqt4_differences.html#object-destruction-on-exit<br><br>> 1)"The parent argument, if not None, causes self to be owned by Qt instead of PyQt", does owned by PyQt also mean the object owned by Python ?<br>> If it is true ,then another question below <br><br>Yes - something is either owned by Python/PyQt, or by C++/Qt.<br><br>> 2)In the doc of sip.setdestroyonexit(destroy) says, "Calling this function with a value of False disables the automatic destruction of C++ instances and C structures(owned by Python)." ,then which is responsible for destroying these C++ instances and C structures? the dtor of them ?<br><br>The destructors will never be called in that case - which *usually*<br>isn't an issue, because the application is exiting anyways.<br><br>> 3)In the doc of sip.setdestroyonexit(destroy) says,"When the Python interpreter exits it garbage collects those objects that it can. This means that any corresponding C++ instances and C structures owned by Python are destroyed. Unfortunately this happens in an unpredictable order and so can cause memory faults within the wrapped library. " <br>> <br>> <br>> "since Python does not guarantee that objects will be deleted in a specific order when it exits. On the other hand, when Qt deletes an object, it always tries to delete all its children as well, which will normally ensure that objects get deleted in the right order. This is especially important when Qt takes ownership of an object, because you could end up in a situation where an attempt is made to delete the object twice (which will result in a crash)." quoted from here http://stackoverflow.com/questions/27131294/error-qobjectstarttimer-qtimer-can-only-be-used-with-threads-started-with-qt<br>> <br>> <br>> Since Qt ensure that objects get deleted in the right order, so is it better to let the parent argument not be None, thus causes self to be owned by Qt instead of PyQt? or just set sip.setdestroyonexit(False) ?<br><br>I think it's always a good idea to supply a parent to QObjects, except<br>in one of these cases:<br><br>- It's a top level window.<br>- You know it'll be reparented by Qt, e.g. a widget which will be<br>  added to a layout.<br><br>> 4) When I Wrapped the if __name__ == '__main__': part in a function main(),the issue went away ,can you explain why ? changed version https://bpaste.net/show/36c594a1c82e<br><br>That's interesting - the link above (PyQt4/PyQt5 differences)<br>recommends not doing that. But that's the tricky thing about such<br>segfaults - they don't always happen, and when you touch *something*<br>they maybe go away.<br><br>Florian<br><br>-- <br>http://www.the-compiler.org | <a href="mailto:me@the-compiler.org">me@the-compiler.org</a> (Mail/XMPP)<br>   GPG: 916E B0C8 FD55 A072 | http://the-compiler.org/pubkey.asc<br>         I love long mails! | http://email.is-not-s.ms/<br></blockquote><br><br><span title="neteasefooter"><span id="netease_mail_footer"></span></span>