"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que retornar um literal de string C de uma função std::string parece funcionar às vezes, mas ainda é um comportamento indefinido?

Por que retornar um literal de string C de uma função std::string parece funcionar às vezes, mas ainda é um comportamento indefinido?

Publicado em 2024-11-18
Navegar:850

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

Retornando literal de string C da função std::string e chamando c_str()

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.

Tutorial mais recente Mais>

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