2016-06-09 76 views
0

我正在尝试使用QTextStream来读取QString。由于构造具有以下特征:使用QTextStream的QString的所有权

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

(见the documentation

由于构造函数传递一个原始指针,不知是否QTextStream采取QString的所有权或者如果我要它在管理我的代码确保在QTextStream对象后删除QString对象。

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

+1

我还没有使用'QTextStream'使用这个特殊的构造函数。不过,我认为'QTextStream'对象只是使用'QString'来读取或写入。它不占用'QString'的所有权。 –

回答

3

QTextStream不承担QString的所有权。

其实你可以写这样的功能:

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

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

3

如果文档不特别状态的QTextStream对象取得所有权,这是相当安全的假设,事实并非如此。否则这将是一个非常讨厌的遗漏。

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

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

我鼓励你写一个单元测试,如果你想100%的保证。尽管极其不可能(这毕竟不是PHP),但它可能会在更高版本中发生变化。

+0

它不是'const'的原因是因为'QTextStream'也可以写入它:'stream << 2; //字符串现在包含“2”。 – coyotte508

+0

“这引发了一个问题,为什么参数没有声明为const QString *” - 因为您可能想要写入它。 – Murphy

+0

当然啊。没有意识到它是一个读写容器。谢谢。 – nephtes