Russian Qt Forum
Ноябрь 25, 2024, 17:45 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Преобразовать символ из QChar в char  (Прочитано 38512 раз)
BRE
Гость
« Ответ #15 : Март 23, 2009, 20:15 »

хм, ну вот скока себя помню - всегда работала подобная конструкция
(const char *ptrStr = str.toAscii().constData()Подмигивающий
Это скорее удача, хотя нужно смотреть код, что там компилятор "нагенерил".

естественно, что возвращать ptrStr не стоит Улыбающийся но в локальном методе все ок.
QByteArray то живет до очистки стека.
Эту конструкцию (const char *ptrStr = str.toAscii().constData()Подмигивающий можно записать так:
Код
C++ (Qt)
const char *ptrStr;
{
    QByteArray tmp = str.toAscii();
    ptrStr = tmp.constData();
}
 
Вот если бы деструктор QByteArray занулял бы свою область, то вопросов бы не возникало.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #16 : Март 24, 2009, 12:39 »

Наскольно мне известно, в С++ областью "жизни" локального объекта является блок скобок {...}. Таким образом, два вышеприведенных варианта аналогичны, за исключением того, что в первом создается неименованный экземпляр QByteArray для локального доступа, а во втором он получает имя tmp. Прибиты же оба должны быть при выходе из блока, т.е. после первой всреченной }.
Однако согласен, что все может зависеть от реализации компилятора. Могу только сказать, что по крайней мере я не встречал компиляторов, которые бы некорректно отрабатывали данную ситуацию (но это, как про суслика - его можно не видеть, хотя он есть - ДМБ).
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Rcus
Гость
« Ответ #17 : Март 24, 2009, 12:51 »

/** sigh, \image html facepalm.jpg, \ref Valgrind-free-fill-proof */
Записан
BRE
Гость
« Ответ #18 : Март 24, 2009, 12:52 »

Наскольно мне известно, в С++ областью "жизни" локального объекта является блок скобок {...}. Таким образом, два вышеприведенных варианта аналогичны, за исключением того, что в первом создается неименованный экземпляр QByteArray для локального доступа, а во втором он получает имя tmp. Прибиты же оба должны быть при выходе из блока, т.е. после первой всреченной }.
Ну да, а использовать указатель на tmp, ты будешь после }.

Вариант 1
Код
C++ (Qt)
const char *ptrStr;
{
    QByteArray tmp = str.toAscii();
    ptrStr = tmp.constData();
}
 
// Использование
char ch = ptrStr[ 20 ];
 

Вариант 2
Код
C++ (Qt)
const char *ptrStr = str.toAscii().constData()
 
// Использование
char ch = ptrStr[ 20 ];
 

В обоих случаях объект на который указывает ptrStr уже разрушен.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #19 : Март 24, 2009, 13:02 »

В 1 случае - однозначно, во 2 - depends on compiler.
Стандарт С++ не утверждает, что локальный объект должен уничтожаться в этом случае.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
BRE
Гость
« Ответ #20 : Март 24, 2009, 13:08 »

во 2 - depends on compiler.
Стандарт С++ не утверждает, что локальный объект должен уничтожаться в этом случае.
По стандарту утверждать не буду, не владею информацией....
Но во избежании, лучше не использовать.
А то может получиться сегодня работает, вышла новая версия компилятора и программа умирает. Можно долго голову ломать, а потом долго все вычищать.
Все IMHO.  Подмигивающий
Записан
spirit
Гость
« Ответ #21 : Март 24, 2009, 13:11 »

во 2 - depends on compiler.
Стандарт С++ не утверждает, что локальный объект должен уничтожаться в этом случае.
По стандарту утверждать не буду, не владею информацией....
Но во избежании, лучше не использовать.
А то может получиться сегодня работает, вышла новая версия компилятора и программа умирает. Можно долго голову ломать, а потом долго все вычищать.
Все IMHO.  Подмигивающий
+1, зачем использовать заведомо нестабильный код.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #22 : Март 24, 2009, 13:17 »

во 2 - depends on compiler.

Невстречал такого. Валится прога и на GCC и на MSVC и на ICC по одной и тойже причине - указатель невалиден в виду того что разрущается объект QByteArray. И это не зависит от компилятора или платформы. Для интереса провери ряд тестов, с разными компиляторами, платформами.

ЗЫ: Повторюсь еще раз, загляните в исходники самой Qt на предмет использования таких вот конструкций.
« Последнее редактирование: Март 24, 2009, 13:33 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
BRE
Гость
« Ответ #23 : Март 24, 2009, 13:20 »

Невстречал такого. Валится прога и на GCC и на MSVC и на ICC по одной и тойже причине - указатель невалиден в виду того что разрущается объект QByteArray
Скорее всего, срабатывает то, что деструктор вызван, но данные лежат в стеке ничем не затертые. Вот если бы деструктор QByteArray занулял свои данные, такие номера скорее всего не проходили бы.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #24 : Март 24, 2009, 13:22 »

Стандарт С++ не утверждает, что локальный объект должен уничтожаться в этом случае.

Непонял. А почему он недолжен разрушатся?

У нас отработал комплекс функций str.toAscii().constData(). Локальный объекты умерли, память освободилась, но указатель на эти данные мы сохранили. На что будет указывать этот указатель?

А вот в таких ситуациях будет все ок:

Код
C++ (Qt)
qWarning("%s", str.toAscii().constData());

или

...
Код
C++ (Qt)
some_function(str.toAscii().constData());
....
 
void some_function(const char *str)
{
   //do something with str
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #25 : Март 24, 2009, 13:26 »

А вот тут поподробнее плиз...
Почему тогда будет все ок, если компиль прибьет локальный объект?

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
BRE
Гость
« Ответ #26 : Март 24, 2009, 13:29 »

А вот тут поподробнее плиз...
Почему тогда будет все ок, если компиль прибьет локальный объект?
Локальный объект создается, указатель передается в функцию, функция отрабатывает, при выходе из функции локальный объект уничтожается.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #27 : Март 24, 2009, 13:30 »

У нас отработал комплекс функций str.toAscii().constData(). Локальный объекты умерли, память освободилась

Вот, собственно, почему они должны умереть? Стандарт не говорит об этом.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #28 : Март 24, 2009, 13:37 »

А вот тут поподробнее плиз...
Почему тогда будет все ок, если компиль прибьет локальный объект?

Указатель, переданный в some_function будет оставаться валидным до её завершения, так как временный экземпляр QByteArray остаётся жить в стеке и будет уничтожен сразу же при выходе из этой функции
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #29 : Март 24, 2009, 14:16 »

ну ок, в случае с функцией это да.
А вот такой код -

Код:
{
...
const char *ptrStr = str.toAscii().constData();
...
doSomething(ptrStr);
...
}

очень часто употребляем, и реально я не вижу причин, по которому бы временный экземпляр QByteArray был бы прибит до }. По крайней мере, согласно стандарту. (хотя создатели компилятора могут думать по другому)
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.223 секунд. Запросов: 23.