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
'IT story' 카테고리의 다른 글
MSDeploy (Visual Studio)를 App_Data 폴더를 삭제하지 않고 나머지는 모두 삭제합니다. (0) | 2020.12.30 |
---|---|
Java 클래스가 런타임에 자신에게 메소드를 추가 할 수 있습니까? (0) | 2020.12.30 |
SQL Server Management Studio에서 비활성화 된 오른쪽 클릭 스크립트 변경 테이블 (0) | 2020.12.30 |
푸시 된 후 병합 되돌리기 (0) | 2020.12.30 |
각각의 하위 명령 세트가있는 Click 명령을 여러 파일로 분할하려면 어떻게해야합니까? (0) | 2020.12.30 |