2012-12-11 4 views
1

임시 참조 문자열을 C++에서 안전하게 전달합니까?

void f(const std::string& s) { 
    ... 
} 

f를 기능을 고려하는 것이 안전 다음과 같은 고정 된 문자열로 f를 호출하는 것입니다 : 당신이 함수가 반환 후 사용하지 않는 경우

f("abc"); 
+3

안전하지도 안전하지도 않습니다. 당신이하고 싶은 일에 따라, 당신이 원하는 것을 할 수도,하지 않을 수도 있습니다. –

+0

@ Petetecker 어떤 종류의 것들이 위험 할 수 있습니까? 나는 s를 바꾸려고하지 않는다. –

답변

8

"abc"에서 암시 적으로 구성된 std::string의 수명은 f()에 대한 호출이 끝날 때까지입니다. f()이 끝난 후에 그 참조를 다른 곳에 보관하지 않는 한 완벽하게 안전합니다. 함수가 호출 될 때, 임시 std::string :

std::string const *pstr; 

void f(std::string const &s) 
{ 
    s.length(); // safe. s has an instance backing 
       // it for the lifetime of this function. 

    pstr = &s; // still technically safe, but only if you don't 
       // dereference pstr after this function completes. 
} 

f("abc"); 

pstr->length(); // undefined behavior, the instance 
       // pstr pointed to no longer exists. 
0

그것은 안전합니다.

이 때문에이 문자열 객체가 더 오래 있고 더 오래 사용 되더라도 다른 문자열 객체 (함수가 반환되기 전에)를 초기화하는 데이 함수를 사용하는 것이 안전합니다.

2

당신이 어딘가에 인수에 대한 참조 또는 포인터를 저장하고 주위에 당신이 함수에서 반환되면, 그것은 확인을해야 여전히 희망하지 않는 가정 함수가 실행되는 동안 주위에있는 함수가 만들어집니다.

관련 문제