Comprensión del retorno implícito en una función C
En C, al pasar un literal de cadena a una función, el compilador lo convierte implícitamente en un std::objeto de cadena. Sin embargo, en el siguiente ejemplo, devolvemos un literal de cadena estilo C desde una función std::string:
std::string myFunction() {
return "it's me!!";
}
Esto genera preocupación porque el constructor std::string llamado implícitamente aquí crea una copia del literal de cadena. Cuando la función regresa, esta copia debe cancelarse, dejando un puntero colgante.
¿Qué sucede cuando llamas a c_str()?
Sin embargo, llama a myFunction(). c_str() devuelve un puntero a los datos almacenados en el objeto std::string. Este puntero apunta a la misma memoria que contenía el literal de cadena, incluso después de que se desasignara el objeto std::string.
Por qué esto funciona (más o menos)
El La razón por la que este código parece funcionar se debe a una peculiaridad de la gestión de memoria del sistema operativo. Cuando se desasigna un bloque de memoria, el sistema operativo no siempre borra su contenido. Esto significa que los datos del literal de cadena todavía están presentes en la memoria, aunque técnicamente son inaccesibles.
Comportamiento y suerte indefinidos
Es importante tener en cuenta que este comportamiento no está definido según la norma C. Esto significa que puede pasar cualquier cosa, incluidos fallos o resultados incorrectos. En algunos casos, funciona no debido a las prácticas adecuadas de C, sino debido a los detalles de implementación del sistema operativo.
Por lo tanto, es crucial evitar depender de este comportamiento y asegurarse siempre de que los datos se asignen y desasignen correctamente en su código C. .
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