0

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

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

(见文档

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

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

4

2 回答 2

3

QTextStreamQString获取.

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

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

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

于 2016-06-09T15:36:50.997 回答
3

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

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

事实证明,QTextStream它不拥有所有权,也永远不会尝试删除QString*. 这引发了一个问题,即为什么不将参数声明为const QString*,但这是另一个问题。

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

于 2016-06-09T15:36:58.077 回答