C 함수의 암시적 반환 이해
C에서 문자열 리터럴을 함수에 전달할 때 컴파일러는 암시적으로 이를 함수로 변환합니다. std::문자열 객체. 그러나 다음 예에서는 std::string 함수에서 C 스타일 문자열 리터럴을 반환합니다.
<code class="cpp">std::string myFunction() { return "it's me!!"; }</code>
여기에서 암시적으로 호출된 std::string 생성자가 문자열 리터럴. 함수가 반환되면 이 복사본의 할당을 취소하고 매달린 포인터를 남겨야 합니다.
c_str()을 호출하면 어떻게 되나요?
그러나 myFunction()을 호출합니다. c_str()은 std::string 객체에 저장된 데이터에 대한 포인터를 반환합니다. 이 포인터는 std::string 객체 할당이 해제된 후에도 문자열 리터럴을 보유한 동일한 메모리를 가리킵니다.
이것이 작동하는 이유(일종)
이 코드가 작동하는 것처럼 보이는 이유는 운영 체제의 메모리 관리에 문제가 있기 때문입니다. 메모리 블록 할당이 취소되면 OS가 항상 해당 내용을 지우지는 않습니다. 이는 기술적으로 접근할 수 없음에도 불구하고 문자열 리터럴의 데이터가 메모리에 여전히 존재한다는 것을 의미합니다.
정의되지 않은 동작과 행운
이 동작은 정의되지 않았다는 점에 유의하는 것이 중요합니다. C 표준에 따르면. 이는 충돌이나 잘못된 결과를 포함하여 모든 일이 발생할 수 있음을 의미합니다. 어떤 경우에는 적절한 C 관행 때문이 아니라 OS의 구현 세부 사항 때문에 작동합니다.
따라서 이 동작에 의존하지 말고 항상 C 코드에서 데이터가 올바르게 할당 및 할당 해제되는지 확인하는 것이 중요합니다. .
위 내용은 이 경우 `c_str()`이 할당 해제된 `std::string`에서 작동하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!