【问题标题】:Returning incorrect value from class从类返回不正确的值
【发布时间】:2020-07-02 11:03:18
【问题描述】:

我有以下课程:

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);

在第一种情况下我做错了什么?

【问题讨论】:

    标签: c++ qt lifetime temporary


    【解决方案1】:

    RequestBuilder::getInstance().url().toStdString() 返回的是一个temporary object,它会在完整的表达式之后立即被销毁,之后从临时得到的指针val 变得悬空,任何对它的取消引用都会导致 UB。

    正如您在使用命名变量时所展示的那样,其生命周期在它超出范围时结束,其中val 将保持有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-09
      • 2021-10-26
      • 2015-10-13
      • 2014-12-06
      • 2021-02-01
      • 2017-08-21
      • 2021-10-27
      • 2021-02-10
      相关资源
      最近更新 更多