QString与QTextStream

时间:2016-06-09 15:21:18

标签: c++ qt qstring qtextstream

我正在尝试使用QTextStream来阅读QString。由于构造函数具有以下签名:

    QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)

(见the documentation

由于构造函数传递了一个原始指针,我想知道QTextStream是否取得QString的所有权,或者我是否必须在我的代码中管理它以确保QString对象在QTextStream对象后删除。

我既没有在文档中也没有在搜索引擎上找到任何相关信息(例如google,duckduckgo)。我找到的所有示例都显示了QStringQTextStream具有相同的生命周期(同一函数中的局部变量),所以我不确定如果这两个对象的生命周期不同会发生什么。

2 个答案:

答案 0 :(得分:3)

QTextStream未取得QString的所有权。

实际上你可以写一个这样的函数:

void test()
{
    QString s;
    QTextStream ts(&s);
    ///.....
}

如果QTextStream获得所有权,在这种情况下,QString将被删除两次,并且会出现运行时错误。但是这段代码是正确的,因此QTextStream不会取得所有权

答案 1 :(得分:3)

如果文档未明确声明QTextStream对象取得所有权,则假设它不具有相当安全性。否则,这将是一个非常令人讨厌的遗漏。

但如果您不相信文档通知您,您有两个资源:阅读source code或测试代码中的行为。

事实证明,QTextStream不会取得所有权,也绝不会尝试删除QString*。这提出了一个问题,即为什么参数未被声明为const QString*,但这是另一个问题。

如果您想要100%保证,我鼓励您编写单元测试。虽然极不可能(毕竟这不是PHP),但这种行为可能会在以后的版本中发生变化。