>백엔드 개발 >C++ >std::string 함수에서 C 문자열 리터럴을 반환하는 것이 때때로 작동하는 것처럼 보이지만 여전히 정의되지 않은 동작인 이유는 무엇입니까?

std::string 함수에서 C 문자열 리터럴을 반환하는 것이 때때로 작동하는 것처럼 보이지만 여전히 정의되지 않은 동작인 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-29 09:04:021037검색

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

std::string 함수에서 C 문자열 리터럴 반환 및 c_str() 호출

C에서 std::string 함수에서 C 문자열 리터럴을 반환하는 것은 정의되지 않은 동작으로 이어질 수 있는 잘못된 관행입니다. 그러나 일반적인 오해는 이 코드가 실패해야 하지만 어떤 경우에는 작동하는 것처럼 보인다는 것입니다.

"나야!!" myFunction()에 전달되면 C 문자열 리터럴은 암시적으로 std::string 객체로 변환됩니다. 반환된 std::string 객체는 문자열 리터럴의 복사본을 포함하는 내부 문자 버퍼를 가리킵니다. std::string에서 c_str()을 호출하면 이 버퍼에 대한 포인터가 반환됩니다.

std::string 개체의 내부 문자 버퍼가 정적 메모리에 저장되지 않기 때문에 잠재적인 문제가 발생합니다. myFunction() 함수가 반환되면 std::string 개체와 해당 내부 버퍼가 삭제됩니다. 이는 c_str()에서 얻은 포인터가 할당 해제된 메모리를 가리키는 매달려 있는 포인터가 된다는 것을 의미합니다.

그러나 특정 구현 및 특정 상황에서는 운영 체제가 할당 해제된 std::string에서 사용하는 메모리를 즉시 회수하지 못할 수도 있습니다. . 이것을 메모리 지속성이라고 합니다. 결과적으로 운영 체제에서는 코드가 할당 해제된 메모리에 계속 액세스하도록 실수로 허용하여 코드가 올바르게 작동하는 것처럼 착각하게 만듭니다.

이 동작은 C에서 정의되지 않았다는 점을 강조하는 것이 중요합니다. 언어 표준은 이 상황에서 어떤 일이 발생하는지 정의하지 않으며, 구현마다 다르게 동작할 수 있습니다. 메모리 지속성에 의존하는 것은 위험하며 다른 컨텍스트나 다른 운영 체제에서 예기치 않은 오류가 발생할 수 있습니다.

따라서 예제 코드가 어떤 경우에는 작동하는 것처럼 보일 수 있지만 여전히 정의되지 않은 동작으로 간주되므로 주의해야 합니다. 피했다. 이러한 문제를 방지하려면 내부 버퍼에 대한 직접 포인터 대신 std::string 함수에서 문자열 리터럴의 복사본을 반환하는 것이 좋습니다.

위 내용은 std::string 함수에서 C 문자열 리터럴을 반환하는 것이 때때로 작동하는 것처럼 보이지만 여전히 정의되지 않은 동작인 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.