On Thursday 27 January 2005 10:48, Kevin Kuphal wrote: > I think I found it. In the randomize function it did a playList = > randomList which for QStringLists makes a reference copy of the list. > The randomPlay list is locally scoped and I think dies by the time you > get over to playSelected which means the pointers are all messed up and > hence the segfault.
Nope; wrong. QStringList is one of Qt's "implicitly shared" classes, meaning that the internal storage is passed by reference, but the class maintains a reference count, so even though the local stack variable randomList goes out of scope, the underlying list data is preserved because Qt knows that playList is still referencing it. You'll probably have to look deeper for the source of your segfault. This mechanism is the main reason why all of Qt's implicitly shared classes should be passed *by value* when being used as the return value of a function (though passing by reference is fine as in input parameter). So, const QStringList & someFunction() is bad; use QStringList someFunction() instead (not that this necessarily applies here, but it's a good thing to know about Qt). The shared mechanism also means that there is not much overhead when passing by value (the size of the object is independent of the size of the underlying list data, and the sharing mechanism means copy takes constant time), so you wouldn't really gain much by passing by reference anyway. The other thing to remember about Qt's implicit sharing mechanism is that it employs a copy-on-write/modify mechanism. Meaning that: playList = randomList Causes both variables to share a single copy of the underlying data (with reference counts). As soon as one of those variables is modified, however, it causes the modified object to make a copy of the data and detach from the shared copy (thus decrementing the reference count). For more information on Qt's implicit sharing mechanism, see here: http://doc.trolltech.com/3.3/shclass.html -JAC _______________________________________________ mythtv-dev mailing list [email protected] http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev
