在这篇链接 里看到这样的代码
const char* file_path = FileUtils::getInstance()->fullPathForFilename("hello.json").c_str();log("external file path = %s",file_path);rapidjson::Document d1;std::string contentStr = FileUtils::getInstance()->getStringFromFile(file_path);d1.Parse<0>(contentStr.c_str());//打印JSon文件的内容printf("%s\n",contentStr.c_str());
粗看这个代码,似乎没有问题,实际上有大问题,在我的xcode里运行,第4行的file_path变成了空字符串,为啥?
还有这个例子:
string getString(){ return "just a test";}void test(){ const char *pc = getString().c_str(); cout<<
输出结果会为空。(有的编译器可能没问题)
两段代码的相同点是都存在没有将返回结果赋给string对象再取c_str值,而是直接通过返回的临时对象取c_str值,这样得到的c_str赋值在临时string对象析构后变为空值。
有两种比较可行的解决方法。
1.不要直接返回临时对象的指针,将临时对象先赋值给一个局部对象,再获取其指针。这样,将上例改写为
void test(){ string str = getString(); const char *pc = str.c_str(); cout<<
2.如果要使用临时对象的指针,将所有的使用放到一个语句里进行。这样,将上例改写为
void test(){ cout<<
关于c_str(),还有下面的陷阱:
int main(){ string greet("Hello, world"); string hi(greet); char *ptr = (char *)hi.c_str(); ptr[0] = 'h'; cout << hi << endl; cout << greet << endl;}
int main() { string s = "Alexia"; const char *str = s.c_str(); cout << str << endl; s[1] = 'm'; cout << str << endl; return 0; }
可以试试看有怎样的输出结果。
参考: