>  기사  >  백엔드 개발  >  이 경우 `c_str()`이 할당 해제된 `std::string`에서 작동하는 이유는 무엇입니까?

이 경우 `c_str()`이 할당 해제된 `std::string`에서 작동하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-26 16:24:30599검색

 Why Does `c_str()` Work on a Deallocated `std::string` in This Case?

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

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