c++ - 从类返回不正确的值

标签 c++ qt lifetime temporary

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

关于c++ - 从类返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62694902/

相关文章:

c++ - 如果我只想读取数字,如何忽略文本文件中的单词

c++ - 编译器是否优化了 "for"语句中的第二个条件?

c++ - 在 QT Creator 中构建时强制重新链接

c++ - 可以使用 Qt 输出为 .doc 格式吗?

c++ - 打开 Qt C++ 项目

rust - 如何创建一个构建器,该构建器采用为 `&str` 的切片实现 AsRef 的类型?

c++做套接字关闭自己运行时

closures - 返回在 Rust 中捕获外部变量的闭包

使用 express 和 MongoDB 在 node.js 中的 session 生命周期

c++ - STL::list 对象的最大数量