2013-05-22 10 views
1

나는 스스로 해결할 수없는 문제가 있습니다.문자열에 c_str() 할당

string filenameRaw; 
filenameRaw= argv[1]; 
function(filenameRaw.c_str(),...); 

function(const char* rawDataFile,const char* targetfieldFile,const char* resultFile,const char* filename) 
... 
this->IOPaths.rawData=rawDataFile; 
... 

매우 미세하게 작동합니다. 이제 다른 문자열을 변수 IOPaths.rawData에 넣으려고합니다. ...

function(const char* rawDataFile,const char* targetfieldFile,const char* resultFile,const char* filename) 
... 
string filenameRaw; 
filenameRaw=reader.Get("paths", "rawData", "UNKNOWN") 
... 
const char* rawDataFile1=filenameRaw.c_str(); 
cout << "Compare: " << strcmp(rawDataFile,rawDataFile1) <<endl; 
... 
this->IOPaths.rawData=rawDataFile1; 

더 이상 작동하지 않습니다. 나중에 내 programm에서 파일 이름에 오류가 발생합니다. strcmp는 분명히 0을 제공하므로 문자열은 동일해야합니다. 누구든지 내가 뭘 잘못하고 있는지 생각해?

+0

가능한 [C++의 [StringStream/c \ _str() 손상] (http://stackoverflow.com/questions/10642253/stringstream-c-str-corruption-in-c) – dasblinkenlight

답변

3

c_str()의 출력의 유효 기간은 기껏해야 c_str()이 호출 된 객체의 수명으로 제한됩니다.1

나는 this->IOPaths.rawDatafilenameRaw이 범위를 벗어나 한 번에 메모리를 할당 해제를 가리키는 것으로 의심.

적절한 해결 방법은 [const] char* 대신 std :: string을 전달하는 것입니다. 좋은 stl 구현은 문자열 클래스에 copy on write 의미론을 사용하므로 문자열 데이터를 반복적으로 복사하지 않을 수 있습니다. (그러한 객체가 수정되는 경우와 같은) 어떤 경우


1 , 덜 될 수있다.

+2

"의 유효 기간은 다음과 같이 제한됩니다. 객체 "는 완전히 정확하지 않습니다. 표준 상태 "개체를 수정하는 다른 멤버 함수에 대한 추가 호출로 인해 반환 된 포인터가 무효화 될 수 있습니다." 따라서 그것은 객체의 수명에 의해 제한적이지만, 객체가 (더 빨리 사라질 수도있는 한) 실제로 살아남을 것이라는 보장은 없습니다. – elmo

+0

고마워, 내 문제를 해결. 모든 const char *를 없애고 std :: string으로 대체했습니다. – raspiede