[mythtv] [PATCH] Playlist feature UI tweaking
Kevin Kuphal
kuphal at dls.net
Thu Jan 27 12:31:47 EST 2005
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
More information about the mythtv-dev
mailing list