LINUX.ORG.RU

временный объект c++


0

1

Что то я туплю. В qt есть контейнеры QString и QByteArray.

Положим есть такой код:

QString str = "hello";
QByteArray x(str.toStdString().c_str());

Во второй строке конструктору QByteArray ( const char * str ) передается указатель на char полученный вызовом метода c_str() ВРЕМЕННОГО объекта std::stding.

Вопрос: описано ли в стандарте то что конструктор QByteArray получит указатель на живые данные, что этот временный объект уже не умрет к моменту вычитывания данных из объекта?

Гарантированно работоспособный вариант:

QString str = "hello";
std::string s = str.toStdString();
QByteArray x(s.c_str());

★★★★

Вопрос: описано ли в стандарте то что конструктор QByteArray получит указатель на живые данные, что этот временный объект уже не умрет к моменту вычитывания данных из объекта?

Да. Временные объекты уничтожаются в конце выражения в порядке обратном их созданию. Твой объект будет жить, пока исполняется выражение.

Dragon59 ★★
()
Ответ на: комментарий от zJes

это детали, интересует конкретно приведенный код. как я понимаю никаких гарантий нет и в первом примере неопределенное поведение.

quest ★★★★
() автор топика
Ответ на: комментарий от Dragon59

Да. Временные объекты уничтожаются в конце выражения в порядке обратном их созданию. Твой объект будет жить, пока исполняется выражение.

С чего бы вдруг, ведь конструктор QByteArray ни про какой временный объект не знает, он знает только про char* который указывает возможно уже в никуда. Выражение тут TMP_OBJECT.c_str() - на этом работа с объектом закончена и по идее он уже может быть освобожден.

quest ★★★★
() автор топика
Ответ на: комментарий от quest

У тебя есть выражение:

QByteArray x(str.toStdString().c_str());
string будет гарантированно жив, пока исполняется эта строчка, т.е пока не отработают вызовы c_str() и QByteArray(). Что ещё не понятно?

Dragon59 ★★
()

QByteArray::QByteArray ( const char * str )

Constructs a byte array initialized with the string str.

QByteArray makes a deep copy of the string data.

или я не понял вопрос?

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

QByteArray makes a deep copy of the string data.

Естественно он делает strcpy вот только указатель может указывать уже на левые данные если временный объект к этому момент освобожден.

quest ★★★★
() автор топика
Ответ на: комментарий от quest

Нет, не будет освобождён, пока конструктор QByteArray не завершиться. Ссылки нет, но я гарантирую это, инфа 146%.

nanoolinux ★★★★
()
Ответ на: комментарий от quest

«Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created.»

wota ★★
()
Ответ на: комментарий от quest

И это именно в таком контексте описано в стандарте? Можно цитату?

Выше уже ответили, но открыть стандарт ты должен был до_того, как писать на форум.

Dragon59 ★★
()
Последнее исправление: Dragon59 (всего исправлений: 1)
Ответ на: комментарий от quest

И это именно в таком контексте описано в стандарте? Можно цитату?

Почитать стандарт ты и сам можешь. Нахрена ты спрашиваешь тут? Чтобы потом не верить и требовать других читать тебе за тебя же стандарт?

Pavval ★★★★★
()

Будет работать при условии что QByteArray копирует данные. Если просто сохраняет указатель, то не будет работать

anonymous
()

ЕМНИП временный объеки живет до ;, и таки это было в стандарте.

AIv ★★★★★
()
Ответ на: комментарий от Dragon59

string будет гарантированно жив, пока исполняется эта строчка, т.е пока не отработают вызовы c_str() и QByteArray(). Что ещё не понятно?

+1, иначе программирование превратилось бы в сущий ад если пример по сабжу отрабатывал не гарантированно...

I-Love-Microsoft ★★★★★
()

это называется контекст вызова, и временный объект гарантированно будет жив до конца работы вызова, т.е. до конца конструирования QByteArray().

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