«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему возврат строкового литерала C из функции std::string иногда работает, но поведение все еще остается неопределенным?

Почему возврат строкового литерала C из функции std::string иногда работает, но поведение все еще остается неопределенным?

Опубликовано 18 ноября 2024 г.
Просматривать:716

Why Does Returning a C String Literal from a std::string Function Seem to Work Sometimes, But is Still Undefined Behavior?

Возврат строкового литерала C из функции std::string и вызов c_str()

В C возврат строкового литерала C из функции std::string является опрометчивые действия, которые могут привести к неопределенному поведению. Однако распространенным заблуждением является то, что этот код должен давать сбой, хотя в некоторых случаях он работает.

Когда «это я!!» передается в myFunction(), строковый литерал C неявно преобразуется в объект std::string. Возвращенный объект std::string указывает на свой внутренний буфер символов, который содержит копию строкового литерала. Вызов c_str() для объекта std::string возвращает указатель на этот буфер.

Потенциальная проблема возникает из-за того, что внутренний буфер символов объекта std::string не хранится в статической памяти. После возврата функции myFunction() объект std::string и его внутренний буфер уничтожаются. Это означает, что указатель, полученный из c_str(), становится висячим указателем, указывающим на освобожденную память.

Однако в определенных реализациях и определенных обстоятельствах операционная система не может немедленно вернуть память, используемую освобожденным std::string . Это известно как постоянство памяти. В результате операционная система по ошибке разрешает коду продолжать доступ к освобожденной памяти, создавая иллюзию, что код работает правильно.

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

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

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3