>백엔드 개발 >C++ >C 임시 문자열의 `c_str()`이 함수 호출 후에도 계속 유효한 이유는 무엇입니까?

C 임시 문자열의 `c_str()`이 함수 호출 후에도 계속 유효한 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-16 18:57:21181검색

Why Does a C   Temporary String's `c_str()` Remain Valid After the Function Call?

임시 개체의 수명 재검토

제공된 코드 조각은 C에서 임시 개체의 흥미로운 동작을 보여줍니다. 다음을 고려하십시오.

std::string foo() {
  std::string out = something...;
  return out;
}

void bar(const char* ccp) {
  // Do something with the string...
}

bar(foo().c_str());

질문이 생깁니다. foo()가 반환한 임시 포인터의 "c_str()" 포인터가 여전히 유효한 이유는 무엇입니까? 상식적으로 bar()가 호출되기 전에 임시 항목을 삭제해야 한다고 제안할 수 있습니다. 그러나 그렇지 않습니다.

C 표준에 따르면 임시 객체의 수명은 해당 객체를 생성한 rvalue를 어휘적으로 포함하는 전체 표현식의 평가가 완료될 때까지 연장됩니다. 즉, 주어진 코드에서 foo()가 반환한 임시 개체는 bar() 호출이 완료될 때까지 계속 유지됩니다.

이 개념을 시각화하려면 다음을 고려하세요.

____________________   full-expression ranges from 'b' to last ')'
bar(foo().c_str());
     ^^^^^          ^
       |            |
     birth       funeral

임시 객체는 foo()가 호출될 때 생성됩니다("탄생"으로 표시됨). 이 경우에는 bar(foo().c_str()) 함수 호출인 전체 표현식을 평가하는 동안 활성 상태로 유지됩니다. 함수 호출이 완료되면 임시 개체가 삭제됩니다("장례식"으로 표시됨).

위 내용은 C 임시 문자열의 `c_str()`이 함수 호출 후에도 계속 유효한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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