powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / return str.c_str() не пашет
25 сообщений из 57, страница 1 из 3
return str.c_str() не пашет
    #39954463
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то я наткнулся на непонятку внезапно...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
auto _out()
{
    string str = "blablabla olalala\n";
 
    // не хочет возвращать сразу str.c_str(), надо возвращать str, а уже снаружи делать .c_str()
    return str;
//    return str.c_str();
}

int main(int argc, char *argv[])
{
//    const char* str = _out(); // хочется вот так, но нет
    string str = _out();
    cout << "output: " << str.c_str() << '\n';
}


ЧЯДНТ?
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954465
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По выходу из функции, все объекты объявленные внутри нее - уничтожаются.
То есть когда ты пытаешься вернуть str.c_str() ты возвращаешь указатель на внутренний буффер уничтоженного объекта.
А когда возвращаешь весь объект целиком - он возвращается через копирование. Объект str лежащий на стеке функции _out() уничтожается, но перед этим делается копирование в объект str лежащий на стеке функции main().
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954520
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зря ломаешь копья. Это не С. Это С++. Компилятор поправит твой код и он будет выглядить примерно вот так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
string str;

auto _out()
{
    str = "blablabla olalala\n";
 
    // не хочет возвращать сразу str.c_str(), надо возвращать str, а уже снаружи делать .c_str()
    return;
//    return str.c_str();
}

int main(int argc, char *argv[])
{
//    const char* str = _out(); // хочется вот так, но нет
    _out();
    cout << "output: " << str.c_str() << '\n';
}
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954536
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCc,

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

правильная подсказка была бы с передачей функции ссылки на параметр из вызывающего слоя. тогда логика понятна - функция работает с той переменной, жизнь которой определяет вызывающий.


(круглый)
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954556
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

Все компиляторы оптимизируют это устраняя копирование возвращаемого значения, и по факту функция работает с тем экземпляром куда результат присваивается в вызывающем коде (RVO).
А начиная с С++17 это обязательное поведение.

Так что можете спокойно возвращать строку.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954562
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая необходимость в прикладном коде использовать ASCIIZ ? Вообще нету.

Нет я могу придумать кейс ТОЛЬКО когда тебе надо вызвать функцию операционной системы
и она (эта функция) не имплементирована в твоей прикладной библиотеке или фреймворке вообще.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954572
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0
OoCc,

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

правильная подсказка была бы с передачей функции ссылки на параметр из вызывающего слоя. тогда логика понятна - функция работает с той переменной, жизнь которой определяет вызывающий.


(круглый)

Я не призываю писать такой код. Компилятор это сделает сам. И совсем не обязательно именно такой. Мой поинт был чтобы полудух не заморачивался и не думал за компилятор слишком много.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954661
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OoCc
Зря ломаешь копья. Это не С. Это С++. Компилятор поправит твой код и он будет выглядить примерно вот так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
string str;

auto _out()
{
    str = "blablabla olalala\n";
 
    // не хочет возвращать сразу str.c_str(), надо возвращать str, а уже снаружи делать .c_str()
    return;
//    return str.c_str();
}

int main(int argc, char *argv[])
{
//    const char* str = _out(); // хочется вот так, но нет
    _out();
    cout << "output: " << str.c_str() << '\n';
}


и что тут возвращает компилятор?!
как str попал в main() ?
mayton
Какая необходимость в прикладном коде использовать ASCIIZ ? Вообще нету.

Нет я могу придумать кейс ТОЛЬКО когда тебе надо вызвать функцию операционной системы
и она (эта функция) не имплементирована в твоей прикладной библиотеке или фреймворке вообще.

имеешь ввиду, зачем связываться с char* ?
чтобы отправить в socket
конкретно - в send()
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954673
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух

mayton
Какая необходимость в прикладном коде использовать ASCIIZ ? Вообще нету.

Нет я могу придумать кейс ТОЛЬКО когда тебе надо вызвать функцию операционной системы
и она (эта функция) не имплементирована в твоей прикладной библиотеке или фреймворке вообще.

имеешь ввиду, зачем связываться с char* ?
чтобы отправить в socket
конкретно - в send()

Что за протокол? Raw?
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954678
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да обычный стек TCP/IP (AF_INET)
надо клиент-серверную архитектуру организовать на C++
как это ещё сделать?
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954679
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я пытаюсь понять - это прикладное или системное программирование?

Если системное - то у меня нет вопросов и я удаляюсь.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954690
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну очевидно же, что это низкоуровневый задел
а ты с сокетами через boost::asio ?
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954702
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я с сокетами уже 15 лет вообще никак. Я - прикладник. У меня - Soap/Http/Rest/GraphQL.

Из самого низкоуровневого был SNMP. Это - ближе всего к пакетам.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954716
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Http - это сокеты )
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954719
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нифига. Это прикладной API. И в его интерфейсе нет никакого send и нет никаких сокетов.

Вот типичный http-вызов.

Код: plaintext
1.
2.
3.
httpFuckenClient = new HttpClient();
asyncResponce = httpFuckenClient.get("https://porno-siske.sex/siske.mkv");
.....
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954722
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Нифига. Это прикладной API. И в его интерфейсе нет никакого send и нет никаких сокетов.

Вот типичный http-вызов.

Код: plaintext
1.
2.
3.
httpFuckenClient = new HttpClient();
asyncResponce = httpFuckenClient.get("https://porno-siske.sex/siske.mkv");
.....


Ссылка крутая. Но ГуглТранслейт не справился со словом "Fucken". Это Вы где вычитали?
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954727
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А зачем вы гуглите то что я пишу? Что там гуглить?
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954732
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А зачем вы гуглите то что я пишу? Что там гуглить?

Я просто впервые увидел такое слово. Но справился другой переводчик. Значение слова -- как и ожидалось.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954736
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Нифига. Это прикладной API. И в его интерфейсе нет никакого send и нет никаких сокетов.

Вот типичный http-вызов.

Код: plaintext
1.
2.
3.
httpFuckenClient = new HttpClient();
asyncResponce = httpFuckenClient.get("https://porno-siske.sex/siske.mkv");
.....


ну конечно в интерфейсе нет
но технически ты работаешь с сокетом
т.е. на мой вопрос "как ты работаешь с сокетами" есть ответ - через API
ну т.е. тот же самый boost::asio, только другой API
хотя там внутри как раз он и может оказаться
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954738
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
mayton
Нифига. Это прикладной API. И в его интерфейсе нет никакого send и нет никаких сокетов.

Вот типичный http-вызов.

Код: plaintext
1.
2.
3.
httpFuckenClient = new HttpClient();
asyncResponce = httpFuckenClient.get("https://porno-siske.sex/siske.mkv");
.....


ну конечно в интерфейсе нет
но технически ты работаешь с сокетом
т.е. на мой вопрос "как ты работаешь с сокетами" есть ответ - через API
ну т.е. тот же самый boost::asio, только другой API
хотя там внутри как раз он и может оказаться

Когда мы говорил об ASCIIZ я имел в виду что на прикладном уровне (а Http - это уже прикладной)
вам не нужны примитивы ОС, сокеты, или не дай бох блочные или символьные устройства.
Это всё - завёрнуто в библиотеки и наружу выходят std::string как базовый тип данных
для представления бизнес-информации. 99% это так.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954740
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, и это правильно - использовать готовые библиотеки, а не городить свои
меньше кода = меньше ошибок
и я сам к этому стремлюсь
но не всегда получается...

а ведь string приходится копировать в char* ?
именно copy всей строки надо будет сделать, чтобы в сокет передать...
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954743
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как это соотносится с непониманием времени жизни переменной?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954746
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
да, и это правильно - использовать готовые библиотеки, а не городить свои
меньше кода = меньше ошибок
и я сам к этому стремлюсь
но не всегда получается...

Я рекомендую всячески сопротивляться добавлению в проект каждой новой библиотеки.

Это от разработчика PVS Studio, я согласен абсолютно -- с каждым символом.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954749
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудухи что тут возвращает компилятор?!
как str попал в main() ?


Ты меня спрашиваешь? Это твой код.

полудухда обычный стек TCP/IP (AF_INET)
надо клиент-серверную архитектуру организовать на C++
как это ещё сделать?

Найти человека который знает и умеет это делать.
...
Рейтинг: 0 / 0
return str.c_str() не пашет
    #39954753
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
полудух
да, и это правильно - использовать готовые библиотеки, а не городить свои
меньше кода = меньше ошибок
и я сам к этому стремлюсь
но не всегда получается...

Я рекомендую всячески сопротивляться добавлению в проект каждой новой библиотеки.

Это от разработчика PVS Studio, я согласен абсолютно -- с каждым символом.

Не согласен с точкой зрения. Она - архаична. И ее можно было реплицировать еще в середине 20-го века
когда любой программный продукт был железом+ОС+приложением 3 в одном.

Современный программный продукт - это зачастую на 90% идея, воплощённая в интеграции системных
средств или платформ Amazon/Google/Azure и собственно вашего кода. Которого обычно мало.
Ваш код - это по сути клей который склеивает готовые решения в одно.

Подход когда вы пилите и свой HttpClient и свой (не дай бох) более сложный драйвер
- отбрасывает вас во времени на много спринтов назад и при таком подходе ваши
конкуренты вас обойдут и выдадут работающий прототип.

Последнее - очень важно. Кто первый вышел на рынок - тот победитель.
Сидельцы и народные умельнцы - здесь обычно остаются за бортом. Они - вне рынка ПО.
Они неинтересны потому-что они задержались и поезд ушел.

Поэтому я очень сильно не поддерживаю С++ - ников в их желании иметь свой "свечной заводик"
на любой случай жизни.
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / return str.c_str() не пашет
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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