[KPhotoAlbum] call for review: misc patches
Shawn Willden
shawn-kimdaba at willden.org
Thu May 17 03:50:16 BST 2007
On Wednesday 16 May 2007 03:54:16 pm Jan Kundrát wrote:
> I'd love if someone familiar with C++ can check if I don't leak memory
> somewhere because I feel somehow uncomfortable when overwriting one
> QStringList with another...
I don't see any potential memory leaks. QStringList, QString, etc. handle all
of the memory management automagically. Most all of the Qt classes use
reference counting and copy-on-write semantics so copying is fast and cleanup
is automatic.
I do have one comment about the code, however: It makes an unnecessary copy
of the list returned by currentScope(). The line:
files = DB::ImageDB::instance()->currentScope( true );
actually does not make a copy of the list data, it only increments the
reference count. However, the expression:
QStringList::Iterator it = files.begin()
*does* make an actual copy of the data, perhaps copying the entire database of
file names. Getting a non-const iterator qualifies as a "write" operation
and so invokes the "copy" part of "copy-on-write". Even though you don't
modify anything through that iterator, the QStringList implementation doesn't
know that, so on the grounds that you must intend to make modifications
(otherwise you'd have used a const iterator), it "detaches" the list.
In addition to that copy, the line:
QString fileName = files.first();
also assumes a write (you could modify the reference returned by first()) and
therefore creates a copy. Of course, that list only contains a single
element.
To avoid copying the list returned by currentScope(), use constBegin(), rather
than begin(), and you'll have to assign it to a const_iterator. The other
use of the list is when it is passed to ViewerWidget::load(), but it's passed
as a const reference, so there's no possible write to it, and no need for a
copy to be made.
Shawn.
More information about the Kphotoalbum
mailing list