我有以下类(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将保持有效。

07-25 20:36