2017-05-08 13 views
0

이 코드는 안전한가요? 오류없이 실행되기 때문에 나는 자신을 위해 함정을 세우고 있다고 우려하고 있습니다.반환 된 std :: string에 ptr 전달

void targetMethod(const char *arg); 
std::string helperMethod(char *text) { return std::string(text); } 

targetMethod(helperMethod().c_str()); 

helperMethod()는 표준 : : 문자열을 반환하고, 호출 코드는 기본 문자의 *를 가져오고() targetMethod에 전달합니다. 나는 반환 된 문자열이 일시적이므로 기본 char *를 가져 오는 것이 위험하다는 것에 우려하고 있습니다. 그래서 그 대신 I는 다음과 같이 수행해야합니다

std::string myTemp = helperMethod("hello"); 
targetMethod(myTemp.c_str()); 
+0

고마워요, 코디. 내 수색을 더 세밀하게해야 해. – MJF

답변

2

무엇에 따라 달라집니다. targetMethod. 포인터가 나중에 사용하기 위해 포인터를 저장하면 포인터는 안전하지 않습니다. 그러나 함수 호출 기간 동안 만 사용하면 안전합니다. 문자열의 수명은 문자열이 생성 된 전체 표현식의 끝까지 확장됩니다.

2

임시은 (세미콜론까지) 식의 말까지 살 것이다 그래서 안전합니다.

그렇다면 const char *에서 std :: string을 생성 할 수 있기 때문에 왜 helperMethod가 필요한지 잘 모르겠습니다.

+0

"그래서 안전하다"-'targetMethod'가 포인터 복사를 저장하지 않는 한. – lcs

+0

예. 다른 대답은 "포인터 복사"경고를 추가하고 올바른 것입니다. –

+0

helperMethod()는 실제 환경에서 더 많은 작업을 수행합니다. 그것은 단지 예에서 일어나는 일을 보여주는 것처럼 보입니다. – MJF