Понимание неявного возврата в функции 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