[Interest] QList operator[]

Igor Grivko igrivko at ics.com
Fri Jan 9 18:52:13 CET 2015


Hi Brad,

I think you hit the deep copy of the list.
When you use list[i] the list itself is copied.

To fix this problem in your current code, I think, you should use list.at(i)
instead.

Best regards,
Igor Grivko

On Fri, Jan 9, 2015 at 9:42 PM, Brad Pepers <bpepers at me.com> wrote:

> I added a couple lines of code to an app and suddenly it started chewing
> through memory at an unbelievable rate.  I watched it get up to 12 GB at
> which point it hit my virtual memory limit in Windows and Windows promptly
> blue-screened and died (thank-you Microsoft!).  The changes I made are the
> two commented lines in this code:
>
>         for (int i = 0; i < culture.items.size(); ++i) {
>
>             const CultureItem& it = culture.items[i]; // added this
>
>             qDebug() << it.points.size(); // and this
>
>             CultureGraphicsItem* item = new CultureGraphicsItem(group);
>
>             item->setCulture(culture, i, _coordSys);
>
>         }
>
>
> The culture class has an items member which is a QList<CultureItem> and a CultureItem has a QList<QPointF> of points so all I wanted was to print out the number of points each culture item has.  I was stumped by this until I found that if I just replace the culture.items[i] with culture.items.at(i), the memory problem goes away.  So it seems like even though I'm getting a const reference using operator [] on the QList, it's actually making a deep copy of the data as if I was using the non-const version.
>
>
> I tested this on Windows using Qt 5.4.0 and VisualStudio 2010 and also on a Mac and get the same problem.  Could it be something about my CultureItem class?  Frankly I'm pretty baffled by this so any ideas?
>
>
> Here is the CultureItem class definition in case that helps:
>
>
> class CultureItem {
>
> public:
>
>     CultureItem();
>
>
>     enum CultureType { PolyLine, Text, Contour };
>
>     CultureType type;
>
>
>     // shared attributes
>
>     QString color;
>
>
>     // PolyLine attributes
>
>     int lineWidth;
>
>     int fillPattern;
>
>     bool smooth;
>
>     bool closed;
>
>     QString unknown1;
>
>     QList<QPointF> points;
>
>
>     // Text attributes
>
>     float x;
>
>     float y;
>
>     float height;
>
>     int justification;
>
>     QString text;
>
>
>     bool operator==(const CultureItem& rhs) const;
>
>     bool operator!=(const CultureItem& rhs) const;
>
> };
>
>
> --
>
> Brad
>
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20150109/4a95166c/attachment.html>


More information about the Interest mailing list