我正在处理一个有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)
工作良好.为什么这两种方法有区别?
在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),但谁真的在乎这里.使代码更易于理解本身就是一件好事.
(注意,这是一个猜测,没有看到任何功能签名,但它很可能是一个很好的.)
| 归档时间: |
|
| 查看次数: |
586 次 |
| 最近记录: |