2014-07-21 3 views
0

내 프로그램에 stringstream 변수를 사용하고 있습니다. 다음은 코드입니다 :stringstream은 어떻게 작동합니까?

stringstream keyvalueStream; 
keyvalueStream << // appending some string 

somefun(keyvalueStream.str().c_str()); // Passing the char* 
keyvalueStream.str(std::string()); // clearing the content of this variable. 

나는 somefun() 드릴 것입니다 문자열을 keyvalueStream의 내용에 영향을 삭제합니까?

답변

0

keyvalueStream.str (std :: string())에 도달하면; 귀하의 발췌 문장 somefun (keyvalueStream.str(). c_str()); 이미 실행을 마쳤습니다. 그게 당신 질문 이었으면.

0

아니요. 이미 somefun()에 전달한 내용에 영향을 미치지 않습니다. stringstream :: str()은 값으로 반환하므로 스트림에있는 데이터의 사본이됩니다. 참조가 아닙니다.

+1

@ juanchopanza : 객체는'somefun' 만 반환합니다. (전체 표현의 끝) – MSalters

+0

@MSalters 물론입니다. 내 실수. – juanchopanza

-1

예. 그것은 할 것이다.

str을 얻은 후에는 c_str()으로 전화하지 않아야합니다. 표현의 끝까지 사용할 수 있습니다. cppreference에서

,

노트

STR에 의해 반환 된 기본 문자열의 사본) (그래서 직접 c_str를 호출 식의 말에 파괴 될 것이다 임시 객체이다 str()의 결과 (예 : auto * ptr = out.str(). c_str();)는 매달린 포인터를 생성합니다.

+0

내 경우에는 어떻게해야합니까? 어떠한 제안? ans 이상은 영향을 미치지 않을 것이라고 말했습니까? – balaji

+0

질문에 OP가 반환 된 문자열에서'c_str'을 호출해야하는지 여부에 대한 정보가 충분하지 않습니다. – Praetorian

+0

-1, "표현의 끝"은 충분히 늦은'somefun' 리턴 이후입니다. 'cppreference'에서 인용 한 예제는이 질문에 적용되지 않습니다. – MSalters

3

귀하의 질문에 대한 대답에 따라 달라 somefun 함께 수행 무엇 char const * 당신이 stringstream의 내용을 삭제할지 여부를 당신이 그것을 전달, 그리고에했습니다.

stringstream::str 값하여 std::string 객체 를 반환, 그래서 당신은 나중에 여부 stringstream 내용을 삭제 여부는 무관합니다. 표현

somefun(keyvalueStream.str().c_str()); 

에서

반환 string 객체가 파괴 될 때 somefun 호출이 반환. 따라서 나중에 somefun이 나중에 사용하기 위해 char const *을 저장하면 정의되지 않은 동작이 발생합니다. 인수에 대해 작동하지만 현재 함수 호출에서 필요하면 코드가 안전합니다.