我正在尝试使用QTextStream
来阅读QString
。由于构造函数具有以下签名:
QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
由于构造函数传递了一个原始指针,我想知道QTextStream
是否取得QString
的所有权,或者我是否必须在我的代码中管理它以确保QString
对象在QTextStream
对象后删除。
我既没有在文档中也没有在搜索引擎上找到任何相关信息(例如google,duckduckgo)。我找到的所有示例都显示了QString
和QTextStream
具有相同的生命周期(同一函数中的局部变量),所以我不确定如果这两个对象的生命周期不同会发生什么。
答案 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),但这种行为可能会在以后的版本中发生变化。