Em qua 23 abr 2014, às 09:01:39, Olivier Goffart escreveu:
> >   1858      qba.resize(capacity);
> >
> > [...]
> >
> >   1863      QCOMPARE(qba.capacity(), capacity);
> >
> > [...]
> >
> >   1866      copy = qba;
> 
> copy was still holding the original data.  But there, it is assigned to 
> detached version of itself, therefore the original data get freed.

Yes, I see it now:

  1850      char *data = qba.data();

  1858      qba.resize(capacity);
  1859  
  1860      QByteArray copy = qba;

Now, copy.d == qba,d && refcount == 2.

  1861      qba.reserve(capacity / 2);

reserve() will hit isShared() == true, so qba will detach in order to reserve. 
So copy.d.ref == 1. Note how the tests don't check if qba.constData() == data 
again:

  1862      QCOMPARE(qba.size(), capacity); // we didn't shrink the size!
  1863      QCOMPARE(qba.capacity(), capacity);
  1864      QCOMPARE(copy.capacity(), capacity);
  1865  
  1866      copy = qba;

And, like you said, copy.d gets freed here. One fix is to create a new 
QByteArray on this line, instead of reusing copy.

Or to invert: qba = copy; which is probably what the test intended, given the 
rest of the comparisons:

  1867      qba.reserve(capacity * 2);
  1868      QCOMPARE(qba.size(), capacity);
  1869      QCOMPARE(qba.capacity(), capacity * 2);
  1870      QCOMPARE(copy.capacity(), capacity);
  1871      QVERIFY(qba.constData() != data);

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center

_______________________________________________
Development mailing list
[email protected]
http://lists.qt-project.org/mailman/listinfo/development

Reply via email to