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 함수에서 문자열 리터럴의 복사본을 반환하는 것이 좋습니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3