QString 与 QTextStream 的所有权

Ownership of QString with QTextStream

本文关键字:所有权 QTextStream QString      更新时间:2023-10-16

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

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

(请参阅文档)

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

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

QTextStream

拥有QString的所有权。

实际上,你可以编写这样的函数:

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

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

如果文档没有明确说明QTextStream对象拥有所有权,那么假设它没有所有权是相当安全的。 否则这将是一个非常令人讨厌的遗漏。

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

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

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