>백엔드 개발 >C++ >C에서 임시 문자열과 함께 `std::string::c_str()`을 ​​사용하는 것이 안전합니까?

C에서 임시 문자열과 함께 `std::string::c_str()`을 ​​사용하는 것이 안전합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-13 14:09:02891검색

Is Using `std::string::c_str()` with a Temporary String Safe in C  ?

임시 문자열의 무결성 유지: std::string::c_str() 탐색

C 영역에서는 안전과 임시 문자열과 관련된 코드의 유효성은 종종 우려를 불러일으킵니다. 그러한 질문 중 하나는 임시 문자열의 컨텍스트 내에서 std::string::c_str()의 사용법을 둘러싸고 있습니다.

질문:

다음 코드 조각을 고려해보세요.

void consumer(char const* p)
{
  std::printf("'%s'", p);
}

std::string random_string_generator();

consumer(random_string_generator().c_str());

딜레마는 임시 std::string 객체가 파괴될 수 있다는 점에서 비롯됩니다. c_str() 포인터를 검색합니다. 이는 C 표준에 따라 유효성 문제를 제기합니까?

답변:

임시 항목의 수명을 이해하는 것이 중요합니다. C에서 임시 항목은 생성 직후나 사용 전이 아니라 전체 표현이 끝나면 삭제됩니다. 따라서 주어진 코드에서 임시 std::string 개체는 Consumer()에 대한 함수 호출이 끝날 때까지 유지됩니다.

std::string::c_str()을 통해 얻은 포인터는 다음까지 유효합니다. const가 아닌 작업은 문자열 객체에 대해 수행되거나 파괴됩니다. 문자열 개체는 일시적이고 전체 표현식이 끝나면 소멸되므로 코드는 실제로 형식이 올바르고 유효합니다.

역사 각주:

다음이 중요합니다. 위에 설명된 동작은 C 98로 표준화되었습니다. 그 전에는 임시 항목의 수명이 컴파일러 구현에 따라 달라졌습니다. 그러나 표준이 성숙해짐에 따라 동작이 균일하게 정의되어 컴파일러 전반에 걸쳐 일관성이 보장되었습니다.

위 내용은 C에서 임시 문자열과 함께 `std::string::c_str()`을 ​​사용하는 것이 안전합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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