"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 이 경우 `c_str()`이 할당 해제된 `std::string`에서 작동하는 이유는 무엇입니까?

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

2024년 11월 11일에 게시됨
검색:923

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

C 함수의 암시적 반환 이해

C에서 문자열 리터럴을 함수에 전달할 때 컴파일러는 이를 암시적으로 std::문자열 객체. 그러나 다음 예에서는 std::string 함수에서 C 스타일 문자열 리터럴을 반환합니다.

std::string myFunction() {
    return "it's me!!";
}

여기에서 암시적으로 호출된 std::string 생성자가 문자열 리터럴의 복사본을 생성하기 때문에 이는 우려를 불러일으킵니다. 함수가 반환되면 이 복사본은 할당 해제되어야 하며 매달린 포인터는 남습니다.

c_str()을 호출하면 어떻게 되나요?

그러나 myFunction()을 호출합니다. c_str()은 std::string 객체에 저장된 데이터에 대한 포인터를 반환합니다. 이 포인터는 std::string 객체의 할당이 해제된 후에도 문자열 리터럴을 보유한 동일한 메모리를 가리킵니다.

이것이 작동하는 이유(일종)

The 이 코드가 작동하는 것처럼 보이는 이유는 운영 체제의 메모리 관리에 문제가 있기 때문입니다. 메모리 블록 할당이 취소되면 OS가 항상 해당 내용을 지우지는 않습니다. 이는 기술적으로 접근할 수 없음에도 불구하고 문자열 리터럴의 데이터가 여전히 메모리에 존재한다는 것을 의미합니다.

정의되지 않은 동작과 행운

이 동작은 정의되지 않았다는 점에 유의하는 것이 중요합니다. C 표준에 따르면. 이는 충돌이나 잘못된 결과를 포함하여 모든 일이 발생할 수 있음을 의미합니다. 이는 적절한 C 관행 때문이 아니라 OS의 구현 세부 사항 때문에 작동하는 경우도 있습니다.

따라서 이 동작에 의존하지 않고 항상 C 코드에서 데이터가 올바르게 할당 및 할당 해제되는지 확인하는 것이 중요합니다. .

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3