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

Почему в этом случае c_str() работает с освобожденным std::string?

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

 Why Does `c_str()` Work on a Deallocated `std::string` in This Case?

Понимание неявного возврата в функции C

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

std::string myFunction() {
    return "it's me!!";
}

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

Что происходит при вызове c_str()?

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

Почему это работает (вроде)

Причина, по которой этот код работает, связана с особенностью управления памятью операционной системы. Когда блок памяти освобождается, ОС не всегда очищает его содержимое. Это означает, что данные строкового литерала все еще присутствуют в памяти, даже если они технически недоступны.

Неопределенное поведение и удача

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

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

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

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

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

Copyright© 2022 湘ICP备2022001581号-3