首页 > 代码库 > 小心使用临时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()值