LINUX.ORG.RU

[Qt][грабли?] Время жизни объекта, возвращаемого toAscii

 


0

1

Нубский вопрос по C++/Qt, навеянный http://www.linux.org.ru/forum/development/5610360 .

Есть такой кусок кода:

   const char *fname = fileName.toAscii().constData();

// <--- здесь делаются какие-то действия, в которых может выделяться память

// <--- здесь должен использоваться fname
   hf = H5Fcreate(fname, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT);

fileName — переменная типа QString.

Как я понял, метод toAscii возвращает объект типа QByteArray, от которого берется constData и объект сразу же уничтожается (потому что выходит из области видимости). В результате указатель, возвращаемый constData(), подвисает, и эти данные могут испортиться (и вроде как портятся) при любой операции, в которой выделяется новая память.

1) Прав ли я?

2) Как исправить эту ошибку? Правильно ли писать так:

   QByteArray barray = fileName.toAscii()
   const char *fname = barray.constData();

// ...

3) Если пункт 1 верен, то (в порядке критики C++) насколько это распространенные грабли?


1) пункт 1 верен, об этом написано в стандарте - временный объект уничтожается при выходе из контекста вызова. fname начинает указывать на невыделенную область памяти.

2) правильно, потому что надо читать документацию

The pointer remains valid as long as the byte array isn't reallocated or destroyed.

former_anonymous ★★★
()

2) можешь сразу передать в функцию barray.constData(), хранить указатель в переменной особого смысла нет.

nu11 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.