Em C , retornar um literal de string C de uma função std::string é um prática imprudente que pode levar a um comportamento indefinido. No entanto, um equívoco comum é que esse código deve falhar, embora pareça funcionar em alguns casos.
Quando "sou eu!!" é passado para myFunction(), o literal da string C é implicitamente convertido em um objeto std::string. O objeto std::string retornado aponta para seu buffer de caracteres interno, que contém uma cópia da string literal. Chamar c_str() no std::string retorna um ponteiro para este buffer.
O problema potencial surge porque o buffer de caracteres interno do objeto std::string não é armazenado na memória estática. Assim que a função myFunction() retornar, o objeto std::string e seu buffer interno serão destruídos. Isso significa que o ponteiro obtido de c_str() se torna um ponteiro pendente apontando para a memória desalocada.
No entanto, em certas implementações e certas circunstâncias, o sistema operacional pode não recuperar imediatamente a memória usada pelo std::string desalocado . Isso é conhecido como persistência de memória. Como resultado, o sistema operacional permite erroneamente que o código continue acessando a memória desalocada, dando a ilusão de que o código funciona corretamente.
É importante enfatizar que esse comportamento é indefinido em C . O padrão da linguagem não define o que acontece nesta situação e diferentes implementações podem se comportar de maneira diferente. Depender da persistência da memória é perigoso e pode levar a erros inesperados em diferentes contextos ou em diferentes sistemas operacionais.
Portanto, embora o código de exemplo possa parecer funcionar em alguns casos, ainda é considerado um comportamento indefinido e deve ser evitado. Para evitar tais problemas, é recomendado retornar uma cópia da string literal da função std::string em vez de um ponteiro direto para seu buffer interno.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3