const char*和literal string之间有什么区别?

Mav*_*k33 4 c++ qt

我正在处理一个有QT小部件的表单,我必须在QTextEdit字段中设置一些值.我不得不调用一个声明为的函数:

 void SDB::setDescription(const char *Description);
Run Code Online (Sandbox Code Playgroud)

当我用这种方法称呼它时(i)

const char * desc = saveOptionsDesLineEditBox->text().toStdString().c_str();
SDB::setDescription(desc);
Run Code Online (Sandbox Code Playgroud)

它在窗口小部件的文本框中显示无法识别的符号.但通过第二种方法调用(ii)

SDB::setDescription(saveOptionsDesLineEditBox->text().toStdString().c_str());
Run Code Online (Sandbox Code Playgroud)

工作良好.为什么这两种方法有区别?

BoB*_*ish 7

std::string返回的saveOptionsDesLineEditBox->text().toStdString()是一个临时的.它超出了行尾的范围,并且随着其内容被销毁.因此,引用在下一行中const char*通过c_str()through 返回的包含desc是未定义的行为.


你打电话的时候

SDB::setDescription(saveOptionsDesLineEditBox->text().toStdString().c_str());
Run Code Online (Sandbox Code Playgroud)

在同一个语句中,临时存在的时间足够长,setDescription可以安全地读取和复制c字符串.

我建议一些事情

std::string desc = saveOptionsDesLineEditBox->text().toStdString();
SDB::setDescription(desc.c_str());
Run Code Online (Sandbox Code Playgroud)

严格来说,这将产生一个超过必要的副本(或者如果你有的话c++11),但谁真的在乎这里.使代码更易于理解本身就是一件好事.

(注意,这是一个猜测,没有看到任何功能签名,但它很可能是一个很好的.)