임시 항목의 수명 재검토
원래 질문에 제공된 코드 조각은 foo()에 의해 반환된 임시 문자열이 겉보기에 역설적인 동작을 보여줍니다. 입국 시 파기된 것으로 추정되는 경우에도 유효합니다. bar().
가정과 달리 임시 개체는 이를 생성한 함수가 완료될 때 완전히 삭제되지 않습니다. 대신 임시 항목을 포함하는 전체 표현식이 완전히 평가될 때까지 수명이 연장됩니다.
이 개념을 설명하기 위해 코드를 해당 구성 요소로 나누어 보겠습니다.
C 언어 규칙에 따라 foo().c_str()에 의해 생성된 임시 const char*는 전체 표현식 bar(foo().c_str()이 나올 때까지 지속됩니다. )가 완전히 평가되었습니다. 이는 foo() 실행이 완료된 후에도 포인터가 유효하다는 것을 의미합니다.
이 동작을 시각화하려면 다음 타임라인을 상상해 보세요.
|--------------------|-----------|-----------|-----------| | | birth | funeral | | | | ^^^ | ^^^^ | | |--------------------| | | | | | bar() | | | | | | | | |--------------------| | | | | | | | evaluated | | | | | bar() | |--------------------| | | | | | | foo() | | | | | | | |--------------------| | | |
임시 개체(문자열 out 및 const char* 포인터)는 foo().c_str() 표현식이 평가될 때 생성되며 전체 표현식 bar(foo().c_str())이 평가될 때까지 지속됩니다. 이렇게 하면 함수가 문자열에 액세스하려고 할 때 bar()에 제공된 포인터가 여전히 유효한지 확인할 수 있습니다.
따라서 foo()가 반환한 임시 항목은 호출 후 삭제된다고 가정하는 것이 옳습니다. bar()는 임시를 포함하는 전체 표현식의 끝을 표시하므로 완료됩니다.
위 내용은 임시 문자열을 생성한 함수가 반환된 후에도 임시 문자열이 계속 유효한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!