注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itas109的博客

http://blog.csdn.net/itas109

 
 
 

日志

 
 

小心使用临时string对象的c_str()值  

2016-05-07 21:46:08|  分类: VS |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://my.oschina.net/ioslighter/blog/361046

在这篇链接http://blog.csdn.net/while0/article/details/26291855  里看到这样的代码


?


1
2
3
4
5
6
7

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变成了空字符串,为啥?

还有这个例子:


?


1
2
3
4
5
6
7
8
9

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(),还有下面的陷阱:


?


1
2
3
4
5
6
7
8

int
 
main(){ 
    
string greet(
"Hello, world"
);        
    
string hi(greet);        
    
char
 
*ptr = (
char
 
*)hi.c_str();        
    
ptr[0] = 
'h'
;        
    
cout << hi << endl;        
    
cout << greet << endl;
}

?

1
2
3
4
5
6
7
8

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 

  评论这张
 
阅读(40)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017