我有以下类(class):
class RequestBuilder : QObject
{
Q_OBJECT
public:
static RequestBuilder& getInstance()
{
static RequestBuilder instance;
return instance;
}
RequestBuilder(RequestBuilder const&) = delete;
void operator=(RequestBuilder const&) = delete;
void setUrl(const QString& url){ url_ = url; };
QString url() const { return url_; };
private:
RequestBuilder(){};
QString url_ = "some_string";
};
1.)当我这样称呼它时,我得到了一些不可读的字节(困惑的输出):const char* val = RequestBuilder::getInstance().url().toStdString().c_str();
printVal(val);
2)当我这样称呼它时,结果是正确的:auto string = RequestBuilder::getInstance().url().toStdString();
const char* val = string.c_str();
printVal(val);
我在第一种情况下做错了什么? 最佳答案
RequestBuilder::getInstance().url().toStdString()
返回的是一个temporary object,它将在完整表达式后立即销毁,之后,从临时对象获取的指针val
会变得悬空,任何对其的取消引用都将导致UB。
正如您在使用命名变量时所展示的那样,该变量的生存期在其超出范围时结束,在该范围内val
将保持有效。