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
