Joseph A. Caputo wrote:
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
Yeah, I came across that but couldn't tell specifically if the local
scope would cause this problem or not. I changed a bit of how the whole
thing works anyways so we'll see when I get a chance to test if I
eliminated the segfault by design or just by accident :)
Thank you for that write up, it was very detailed and helpful.
Kevin
_______________________________________________
mythtv-dev mailing list
[email protected]
http://mythtv.org/cgi-bin/mailman/listinfo/mythtv-dev