>백엔드 개발 >C++ >## C에서 문자열을 반환하는 함수에 `std::string.c_str()`을 ​​사용할 때 왜 실패합니까?

## C에서 문자열을 반환하는 함수에 `std::string.c_str()`을 ​​사용할 때 왜 실패합니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-26 12:30:29745검색

## Why Does `std::string.c_str()` Fail When Used on a Function Returning a String in C  ?

문자열을 반환하는 함수의 std::string.c_str()이 실패하는 이유 이해

C에서 함수가 문자열을 반환할 때 , 가치에 따라 그렇게 합니다. 이는 반환된 문자열이 원본 문자열에 대한 참조가 아니라 원본 문자열의 복사본임을 의미합니다. 이는 기본적으로 참조로 반환되는 정수 또는 부동 소수점과 같은 다른 내장 유형의 동작과 다릅니다.

귀하의 예에서 getString() 함수는 복사본인 문자열 객체를 반환합니다. 문자열 "hello"의 이 복사본은 메모리의 임시 위치에 저장됩니다. 라인 const char* cStr = getString().c_str(); 반환된 문자열을 나타내는 C 스타일 문자열을 가져오려고 시도합니다. 그러나 임시 문자열이 이미 소멸되었기 때문에 포인터 cStr은 이제 유효하지 않은 메모리를 가리킵니다.

임시 개체의 소멸

이 동작에 대한 설명은 다음과 같습니다. C의 임시 객체에 대한 규칙. 임시 개체는 불필요한 복사를 피하기 위해 컴파일러에서 암시적으로 생성되는 개체입니다. 귀하의 경우, getString()에 의해 생성된 임시 문자열은 임시 개체입니다.

임시 개체는 생성된 전체 표현식이 끝나면 삭제됩니다. 전체 표현식은 다른 표현식의 하위 표현식이 아닌 표현식입니다. 귀하의 예에서 const char* cStr = getString().c_str(); 완전한 표현이다. 따라서 getString()에 의해 생성된 임시 문자열은 이 줄의 끝에서 삭제됩니다.

문제 예방

이 문제를 방지하려면 다음과 같은 몇 가지 옵션이 있습니다.

  • C 스타일 문자열을 추출하기 전에 반환된 문자열을 명명된 변수에 저장합니다.
  • 반환된 문자열을 const lvalue-reference 또는 rvalue-reference에 바인딩합니다.
  • 임시 문자열이 삭제되기 전에 C 스타일 문자열 포인터를 사용하세요.

이러한 지침을 따르면 매달린 포인터와 관련된 문제를 방지하고 코드가 올바르게 작동하는지 확인할 수 있습니다.

위 내용은 ## C에서 문자열을 반환하는 함수에 `std::string.c_str()`을 ​​사용할 때 왜 실패합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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