2013-05-22 85 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()的输出的有效性最多只限于调用对象的生命周期。

我怀疑this->IOPaths.rawData指向一次释放的内存filenameRaw超出范围。

一个适当的补救措施是将std :: string而不是[const] char*。一个好的stl实现会在字符串类的写入语义上使用复制,所以也许你不会反复复制字符串数据。


在某些情况下(例如,如果所述对象被修改),这可能是更小。

+2

“是限于生命的该对象“并不完全精确。标准状态“返回的指针可能会因修改对象的其他成员函数的进一步调用而失效”。所以它是真实的,它被对象的生命周期所限制,但没有什么能保证它只要对象(可能会更快消失)就会真正生活。 – elmo

+0

非常感谢,解决了我的问题。我摆脱了所有的const char *并将其替换为std :: string .. – raspiede