首页 > 代码库 > 小心使用临时string对象的c_str()值
小心使用临时string对象的c_str()值
在这篇链接http://blog.csdn.net/while0/article/details/26291855 里看到这样的代码
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<<pc<<endl; }
输出结果会为空。(有的编译器可能没问题)
两段代码的相同点是都存在没有将返回结果赋给string对象再取c_str值,而是直接通过返回的临时对象取c_str值,这样得到的c_str赋值在临时string对象析构后变为空值。
有两种比较可行的解决方法。
1.不要直接返回临时对象的指针,将临时对象先赋值给一个局部对象,再获取其指针。这样,将上例改写为
void test() { string str = getString(); const char *pc = str.c_str(); cout<<pc<<endl; }
2.如果要使用临时对象的指针,将所有的使用放到一个语句里进行。这样,将上例改写为
void test() { cout<<getString().c_str()<<endl; }
关于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; }
可以试试看有怎样的输出结果。
参考:
http://www.cnblogs.com/studynote/p/3476993.html
http://blog.csdn.net/song_hui_xiang/article/details/8830000
http://blog.sina.com.cn/s/blog_4e0c21cc010095hf.html
小心使用临时string对象的c_str()值
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。