2013-05-22 3 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; 

Это не работает. Позже в моей программе я получаю ошибки с именем файла. Strcmp определенно дает 0, поэтому строки должны быть равны. Кто-нибудь имеет представление, что я делаю неправильно?

+0

Возможный дубликат [StringStream/c \ _str() коррупция в C++] (http://stackoverflow.com/questions/10642253/stringstream-c-str-corruption-in-c) – dasblinkenlight

ответ

3

Действительность выхода c_str() ограничена, по крайней мере, временем жизни объекта, на который был вызван c_str().

Я подозреваю, что this->IOPaths.rawData указывает на освобождаться память раз filenameRaw выходит за рамки.

Соответствующим средством было бы передать std :: string, а не [const] char*. Хорошая реализация stl будет использовать копию для семантики записи для строкового класса, поэтому, возможно, вы не будете многократно копировать строковые данные.


В некоторых случаях (например, если объект изменен), это может быть меньше.

+2

"ограничен временем жизни объект ", который не совсем точен. Стандартные состояния «Возвращенный указатель может быть аннулирован дальнейшими вызовами других функций-членов, которые изменяют объект». Так что это правда, что это _limited_ по продолжительности жизни объекта, но ничто не гарантирует, что он действительно будет жить до тех пор, пока объект (может исчезнуть раньше). – elmo

+0

Большое спасибо, что исправляет мою проблему. Я избавился от всех const char * и заменил их на std :: string .. – raspiede

Смежные вопросы