QString 与 QTextStream 的所有权

Ownership of QString with QTextStream

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

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

(参见 the documentation

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

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

QTextStream 没有取得 QString 的所有权。

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

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

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

如果文档没有具体 声明 QTextStream 对象获得所有权,则可以相当安全地假设它没有。否则这将是一个非常令人讨厌的遗漏。

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

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

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