>  기사  >  백엔드 개발  >  함수에서 반환된 할당 해제된 `std::string`에 대해 `c_str()`을 ​​호출하는 것이 작동하는 것처럼 보이지만 실제로는 정의되지 않은 동작으로 이어지는 이유는 무엇입니까?

함수에서 반환된 할당 해제된 `std::string`에 대해 `c_str()`을 ​​호출하는 것이 작동하는 것처럼 보이지만 실제로는 정의되지 않은 동작으로 이어지는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 04:16:02929검색

Why Does Calling `c_str()` on a Deallocated `std::string` Returned from a Function Seem to Work, But Actually Leads to Undefined Behavior?

std::string 함수에서 C 문자열 리터럴을 반환하고 c_str()을 호출하면 정의되지 않은 동작이 발생할 수 있는 이유

최근 강의에서, 약간의 혼란을 야기하는 C 코드 조각을 접했을 수도 있습니다.

<code class="cpp">std::string myFunction() { return "it's me!!"; }

int main() {
  const char* tempString = myFunction().c_str();
  char myNewString[100] = "Who is it?? - ";
  strcat(myNewString, tempString);
  printf("The string: %s", myNewString);
}</code>

"return 'it's me!!'"가 암시적으로 std::string 생성자를 호출하기 때문에 이 코드가 실패할 것이라고 가정하는 것은 이해할 수 있습니다. const char[]를 사용합니다. 결과적으로, 함수에서 반환된 std::string은 함수가 반환될 때 즉시 할당이 취소됩니다. 그러나 놀랍게도 코드는 아무런 문제 없이 실행됩니다.

코드 분석이 정확합니다. 여기에 표시된 동작은 정의되지 않은 동작에 속합니다. 이러한 경우 영향은 매우 다양할 수 있습니다. 이 특정 인스턴스에서는 문자열에 할당된 메모리가 기술적으로 할당 해제되었음에도 불구하고 액세스 시 원래 데이터를 계속 유지합니다. 이 현상은 운영 체제가 할당 해제된 메모리를 자동으로 지우지 않고 나중에 사용할 수 있도록 표시하도록 선택하기 때문에 자주 발생합니다.

그러나 메모리 할당 해제 처리는 C의 책임이 아니라는 점에 유의하는 것이 중요합니다. 언어; 이는 각 운영 체제 구현과 관련된 복잡한 세부 사항입니다. C 관점에서는 포괄적인 "정의되지 않은 동작"이 적용됩니다. 따라서 이러한 동작에 의존하는 것은 코드에서 예측할 수 없고 잠재적으로 치명적인 결과를 초래할 수 있으므로 권장되지 않습니다.

위 내용은 함수에서 반환된 할당 해제된 `std::string`에 대해 `c_str()`을 ​​호출하는 것이 작동하는 것처럼 보이지만 실제로는 정의되지 않은 동작으로 이어지는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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