博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小心使用临时string对象的c_str()值
阅读量:6070 次
发布时间:2019-06-20

本文共 1330 字,大约阅读时间需要 4 分钟。

hot3.png

在这篇链接  里看到这样的代码

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; }

可以试试看有怎样的输出结果。

参考:

 

转载于:https://my.oschina.net/ioslighter/blog/361046

你可能感兴趣的文章
怎样理解阻塞非阻塞与同步异步的区别?
查看>>
Java并发编程实战(chapter_2)(对象发布、不变性、设计线程安全类)
查看>>
函数指针与指针函数的区别
查看>>
函数_实例4_使用位置参数和函数返回结果
查看>>
高效学习LINUX内核
查看>>
json文件转excel表格
查看>>
RF learning~~
查看>>
new Date()设置日期在IOS的兼容问题
查看>>
jQuery最佳实践
查看>>
MSSQL修改列属性
查看>>
mysql 读写分离工具
查看>>
Oracle 数据库模糊查询
查看>>
好久没有来了
查看>>
Linux服务器性能评估与优化
查看>>
ListView 详解
查看>>
初窥系统集成
查看>>
程序员应该知道的100个Vim命令
查看>>
实验设计与排错之一静态路由
查看>>
第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码及...
查看>>
如何应对勒索病毒
查看>>