IT story

std :: string :: c_str () 및 임시

hot-time 2020. 12. 30. 19:17
반응형

std :: string :: c_str () 및 임시


다음 C ++ 코드가 올바른 형식입니까?

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

std::string random_string_generator()
{
  // returns a random std::string object
}

consumer(random_string_generator().c_str());

내가 가진 문제는 임시 std :: string 객체를 만들고 c_str () 포인터를 취한 후 std :: string 객체가 파괴되는 것을 막을 수 없다는 것입니다 (또는 내가 틀렸을 수도 있습니다). 모든 것에도 불구하고 코드가 괜찮다면 표준을 알려 주시겠습니까? g ++로 테스트 할 때 작동합니다.


std::string::c_str()포인트가 반환하는 포인터 는 문자열 객체가 유지하는 메모리 가리 킵니다. 상수가 아닌 함수가 문자열 개체에서 호출되거나 문자열 개체가 파괴 될 때까지 유효합니다. 염려하는 문자열 객체는 일시적입니다. 전체 표현식이 끝나기 전과 후가 아닌 끝에서 소멸됩니다. 귀하의 경우 전체 표현식의 끝은에 대한 호출 이후 consumer이므로 코드가 안전합니다. consumer나중에 사용할 생각으로 포인터를 어딘가에 저장하면 그렇지 않습니다 .

임시의 수명은 C ++ 98 이후로 엄격하게 정의되었습니다. 그 전에는 컴파일러에 따라 다르며 작성한 코드는 g ++에서 작동하지 않았을 것입니다 (1995 년 이전, 대략 —g ++는 표준위원회가 투표했을 때 거의 즉시 변경되었습니다). (그때도 std::string없었지만 동일한 문제가 사용자가 작성한 문자열 클래스에 영향을 미칩니다.)


임시 std::string의 수명은 consumer반환 되는 지점을 넘어서 확장 되므로 해당 문자열 에서 .NET 내부에서 직접consumer 사용하는 것이 안전합니다 . 무엇 되지 확인하는 것은 그 값을 저장하는 것입니다 c_str반환하고 나중에 사용하려고 (파괴 된 것이다 임시을, 그리고 우리는 단지 당신이 포인터의 다른 쪽 끝에서 무엇을 찾을 것입니다 추측 할 수있다).


random_string_generator () 함수가 반환하는 임시 값은 consumer () 함수에서 안전하게 사용할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/10006891/stdstringc-str-and-temporaries

반응형