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 중국어 웹사이트의 기타 관련 기사를 참조하세요!