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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Преобразовать символ из QChar в char  (Прочитано 36636 раз)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



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

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

А вот в таком коде получим невалидный указатель.

1) Вызвали toAscii (создался временный объект QByteArray)
2) вызвали constData() - получили указатель на данные временного объекта QByteArray
3) Сохранили указатель в ptrStr. Вроде все ок, но..
4) При переходе к следующей интсрукции - вызов doSomething - временный объект QByteArray разрушается за ненадобностью. Он свое дело сделал. Но у нас остался указатель на его данные.

Думаю что из этого следует понятно..
Записан

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

Сообщений: 2679


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


Просмотр профиля
« Ответ #31 : Март 24, 2009, 15:36 »

Почему краш будет, если "временный объект 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 не волк, в лес не уйдёт
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



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

Арс, я вот непойму одного, почему ты думаешь что это зависит от компилятора?

К примеру код:

Код
C++ (Qt)
const char *data = 0;
 
{
   QByteArray arr;
   data = arr.constData();
}
 
//do something with data

будет зависить от компилятора? Такого если чесно не встричал и неслыхал. Мы вышли из области видимости, arr разрушился. Что тут может зависить от компилятора?
Записан

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

Сообщений: 2679


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


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

Такой код - не будет Улыбающийся
А
Код:
data = str.toAscii().constData()
в общем случае будет, т.к. область видимости для неявного QByteArray теоретически может быть всем методом (или блоком скобок). Тут уже как разработчики компилятора задумали Улыбающийся

Ну т.е. есть 2 варианта трансляции кода вроде сonst char *data = str.toAscii().constData(); doSomething(data);

1.
Код:
const char *data;
QByteArray tmp = str.toAscii();
data = tmp.constData();
doSomething(data);

и 2.
Код:
const char *data;
{
QByteArray tmp = str.toAscii();
data = tmp.constData();
}
doSomething(data);   // тут жопо

Вот я о чем Улыбающийся какой из вариантов выберет компилятор (1 или 2) - в общем случае нигде не определено.
« Последнее редактирование: Март 24, 2009, 16:17 от Racheengel » Записан

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.07 секунд. Запросов: 22.