"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué la devolución de un literal de cadena C desde una función std::string parece funcionar a veces, pero sigue siendo un comportamiento indefinido?

¿Por qué la devolución de un literal de cadena C desde una función std::string parece funcionar a veces, pero sigue siendo un comportamiento indefinido?

Publicado el 2024-11-18
Navegar:301

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

Devolver un literal de cadena C desde la función std::string y llamar a c_str()

En C, devolver un literal de cadena C desde una función std::string es una Práctica desaconsejable que puede conducir a un comportamiento indefinido. Sin embargo, un error común es pensar que este código debería fallar, aunque parece funcionar en algunos casos.

Cuando "¡¡soy yo!!" se pasa a myFunction(), el literal de cadena C se convierte implícitamente en un objeto std::string. El objeto std::string devuelto apunta a su búfer de caracteres interno, que contiene una copia del literal de cadena. Llamar a c_str() en std::string devuelve un puntero a este búfer.

El problema potencial surge porque el búfer de caracteres interno del objeto std::string no está almacenado en la memoria estática. Una vez que regresa la función myFunction(), el objeto std::string y su búfer interno se destruyen. Esto significa que el puntero obtenido de c_str() se convierte en un puntero colgante que apunta a la memoria desasignada.

Sin embargo, en determinadas implementaciones y determinadas circunstancias, es posible que el sistema operativo no recupere inmediatamente la memoria utilizada por la std::string desasignada. . Esto se conoce como persistencia de la memoria. Como resultado, el sistema operativo permite por error que el código continúe accediendo a la memoria desasignada, dando la ilusión de que el código funciona correctamente.

Es importante enfatizar que este comportamiento no está definido en C. El estándar del lenguaje no define lo que sucede en esta situación y diferentes implementaciones pueden comportarse de manera diferente. Depender de la persistencia de la memoria es peligroso y puede provocar errores inesperados en diferentes contextos o en diferentes sistemas operativos.

Por lo tanto, si bien el código de ejemplo puede parecer que funciona en algunos casos, todavía se considera un comportamiento indefinido y debe ser evitado. Para evitar este tipo de problemas, se recomienda devolver una copia del literal de cadena de la función std::string en lugar de un puntero directo a su búfer interno.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3