On 26/05/2021 21:39, Alberto Mardegan wrote:

Now, I haven't dug very deep in QString and QVariant, I preferred to let
the experts talk first :-) Does the code in the QSQLite plugin look
correct to you?

That depends: when does SQLite exactly stop using the string data passed to it exactly?


Is it expected that QString::utf16() makes a memory allocation? And is
it correct that this happens even when the QString is const?

In the overwhelming majority of cases, utf16() won't make any allocation. There's just one exception -- if the QString was built via fromRawData(). In that case, in order to ensure NUL termination, utf16() does actually "detach" (even if it's a const method).

(Fun fact: utf16() is one of the few const methods in Qt value classes which isn't thread safe.)

It's a bit interesting that SQLite takes pointer+size, so does not seem to require NUL termination -- for that use case, there's unicode()/constData() + size(), that never reallocates (unlike utf16()).



And why destroying a const QVariant causes the deallocation of the data
created by QString::utf16()??

QString::utf16 doesn't "create" data: it modifies the string *itself* so that it becomes detached and NUL terminated. When you destroy that QString, you'll be deallocating the data (provided there are no more shallow copies around).

Similarly, when you destroy a QVariant, you destroy the object it's holding (provided there are no further shallow copies around).

So yes, in the general case, destroy QVariant -> destroy the QString contained -> deallocate memory.


HTH,
--
Giuseppe D'Angelo | giuseppe.dang...@kdab.com | Senior Software Engineer
KDAB (France) S.A.S., a KDAB Group company
Tel. France +33 (0)4 90 84 08 53, http://www.kdab.com
KDAB - The Qt, C++ and OpenGL Experts

Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

_______________________________________________
Development mailing list
Development@qt-project.org
https://lists.qt-project.org/listinfo/development

Reply via email to