Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректно возвращать указатель на локальный объект функции? / 19 сообщений из 19, страница 1 из 1
14.10.2017, 13:00
    #39536266
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
Написал такую полезную функцию:

Код: plaintext
1.
2.
3.
4.
std::string ConvertQStringToString(const QString Source)
{
    return Source.toUtf8().constData();  
}



Меня беспокоит, что constData() возвращает указатель, на ЛОКАЛЬНЫЙ массив, созданный функцией toUtf8(). Ведь он удалится при выходе из функции и не факт, что этот код всегда будет работать верно. Правильно мыслю?
Если так писать неверно, то передавать строку приемник в качестве второго параметра?
...
Рейтинг: 0 / 0
14.10.2017, 13:20
    #39536272
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
AlekseySQL Правильно мыслю?

Неправильно. Возврат идёт по значению, а не указателю или ссылке. Данные будут скопированы
в свежевыделенную память.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
14.10.2017, 13:22
    #39536273
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
Спасибо!
...
Рейтинг: 0 / 0
14.10.2017, 15:39
    #39536297
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
Вообще-то в QString есть встроенная функция преоьразования
В std::string ...

AlekseySQLНаписал такую полезную функцию:

Код: plaintext
1.
2.
3.
4.
std::string ConvertQStringToString(const QString Source)
{
    return Source.toUtf8().constData();  
}



Меня беспокоит, что constData() возвращает указатель, на ЛОКАЛЬНЫЙ массив, созданный функцией toUtf8(). Ведь он удалится при выходе из функции и не факт, что этот код всегда будет работать верно. Правильно мыслю?

?

Неправильно.
Массив то локальный, но и из него должна ДО выхода из функции
Сформироваться выходная строка string, и платно вернуться из функции.
Поэтому в этом коде все ок в этом смысле.

А вот как ты собираешься хранить utf8 в std:: string, не понятно.
Оно конечно можно, но ...
[src c++]

Если так писать неверно, то передавать строку приемник в качестве второго параметра?[/quot]

Это как раз был бы вверх идиотизма
...
Рейтинг: 0 / 0
14.10.2017, 16:09
    #39536300
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
AlekseySQLНаписал такую полезную функцию:

Код: plaintext
1.
2.
3.
4.
std::string ConvertQStringToString(const QString Source)
{
    return Source.toUtf8().constData();  
}


Это полностью валидный код - возвращаемое значение создается до удаления всех временных переменных.
Это не оптимальный код правда, но это смотря насколько часто такая функция вызывается.
AlekseySQLпередавать строку приемник в качестве второго параметра?
Не надо.
Возврат std::string в большинстве случаев оптимизируется так что становится равным по эффективности передаче ссылки на результат в аргументах. А в C++11 и выше оптимизация происходит всегда.
...
Рейтинг: 0 / 0
16.10.2017, 12:39
    #39536815
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
MasterZiv , Anatoly Moskovsky - спасибо!
...
Рейтинг: 0 / 0
28.10.2017, 04:53
    #39543624
Корректно возвращать указатель на локальный объект функции?
MasterZivА вот как ты собираешься хранить utf8 в std:: string, не понятно.А в чём проблема?

MasterZivЭто как раз был бы вверх идиотизмаstd::getline смотрит с недоумением.
...
Рейтинг: 0 / 0
28.10.2017, 04:54
    #39543625
Корректно возвращать указатель на локальный объект функции?
Anatoly MoskovskyА в C++11 и выше оптимизация происходит всегда.Может в C++17?
...
Рейтинг: 0 / 0
28.10.2017, 13:24
    #39543666
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
Anatoly MoskovskyВозврат std::string в большинстве случаев оптимизируется так что становится равным по эффективности передаче ссылки на результат в аргументах. А в C++11 и выше оптимизация происходит всегда.
Всегда? Можно ссылку на параграф стандарта С++ и где было описано "всегда". И как "всегда", кстати?

Я хотел бы получить ответ, Анатолий. Если Вас не затруднит, я не ёрничаю.
...
Рейтинг: 0 / 0
28.10.2017, 18:46
    #39543759
Корректно возвращать указатель на локальный объект функции?
Dimitry SibiryakovВозврат идёт по значению, а не указателюПопридираюсь: возврата по указателю не существует, есть возврат по значению для значения указателя. Так что есть только возвраты/передачи по значению и ссылке
...
Рейтинг: 0 / 0
28.10.2017, 20:53
    #39543790
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
ПриплюснутыйТак что есть только возвраты/передачи по значению и ссылке

Да, но ссылка это и есть указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.10.2017, 20:58
    #39543793
Корректно возвращать указатель на локальный объект функции?
Dimitry SibiryakovПриплюснутыйТак что есть только возвраты/передачи по значению и ссылке

Да, но ссылка это и есть указатель.
Цитатку из стандарта, плес.
...
Рейтинг: 0 / 0
28.10.2017, 21:33
    #39543808
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
ПриплюснутыйЦитатку из стандарта

Без цитатки сложно опознать синтаксический сахар?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
28.10.2017, 21:41
    #39543812
Корректно возвращать указатель на локальный объект функции?
Dimitry SibiryakovБез цитатки сложно опознать синтаксический сахар?..Думаю, ты не знаешь определения термина "синтаксический сахар".
Ссылки это не просто сахар, они обладают своей семантикой в языке, которую никак не выразишь через указатели. Взять ту же пресловутую способность продлевать время жизни временных объектов. Никакими синтаксическими заменами это не выразишь через указатели.

Синтаксический сахар — это, например, range-based for loop, который тупо синтаксически можно переписать через обычный for loop.
...
Рейтинг: 0 / 0
30.10.2017, 19:42
    #39544813
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
ПриплюснутыйMasterZivА вот как ты собираешься хранить utf8 в std:: string, не понятно.А в чём проблема?

MasterZivЭто как раз был бы вверх идиотизмаstd::getline смотрит с недоумением.

так это ж STL, им же надо было показать всем, как не нужно писать программы, а то ж никто и не знал до этого....
...
Рейтинг: 0 / 0
30.10.2017, 19:43
    #39544814
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
Dimitry SibiryakovПриплюснутыйТак что есть только возвраты/передачи по значению и ссылке

Да, но ссылка это и есть указатель.


нет, ссылка и указатель р разные типы.
...
Рейтинг: 0 / 0
30.10.2017, 19:46
    #39544817
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
MasterZivссылка и указатель р разные типы.

Типы разные, ассемблерный код один. Ссылка просто не даёт передать инвалидное значение
типа nullptr.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
30.10.2017, 19:50
    #39544820
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
Dimitry SibiryakovMasterZivссылка и указатель р разные типы.

Типы разные, ассемблерный код один. Ссылка просто не даёт передать инвалидное значение
типа nullptr.

1. Если аргумент константная ссылка - туда можно передавать временные объекты (в том числе и созданные конструкторами преобразования).
2. Удержание ссылки.

Для указателей такого нет. Может я что-то еще забыл.
...
Рейтинг: 0 / 0
30.10.2017, 19:52
    #39544823
petrav
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Корректно возвращать указатель на локальный объект функции?
Я тут перечислил что-то важное. А так конечно различий больше, в том числе нельзя для ссылки изменить объект на который она ссылается - аля константный указатель.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Корректно возвращать указатель на локальный объект функции? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]