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)中都没有找到任何相关信息。我发现的所有示例都显示 QString
和 QTextStream
具有相同的生命周期(同一函数中的局部变量),因此我不确定如果这两个对象具有不同的生命周期会发生什么。
QTextStream
没有取得 QString
的所有权。
事实上你可以这样写一个函数:
void test()
{
QString s;
QTextStream ts(&s);
///.....
}
如果 QTextStream
获得所有权,在这种情况下 QString
将被删除两次,并且会出现运行时错误。但是这段代码是正确的,所以 QTextStream
没有取得所有权
如果文档没有具体 声明 QTextStream
对象获得所有权,则可以相当安全地假设它没有。否则这将是一个非常令人讨厌的遗漏。
但如果您不相信文档会通知您,您有两个资源:阅读 source code 或测试代码中的行为。
事实证明,QTextStream
没有取得所有权,也永远不会尝试删除 QString*
。这就提出了一个问题,即为什么不将参数声明为 const QString*
,但这是另一个问题。
如果你想要 100% 的保证,我鼓励你写一个单元测试。虽然极不可能(毕竟这不是 PHP),但行为可能会在以后的版本中发生变化。
我正在尝试使用 QTextStream
读取 QString
。由于构造函数具有以下签名:
QTextStream(QString *string, QIODevice::OpenMode openMode = QIODevice::ReadWrite)
(参见 the documentation)
由于向构造函数传递了一个原始指针,我想知道 QTextStream
是否拥有 QString
的所有权,或者我是否必须在我的代码中管理它以确保 QString
对象在 QTextStream
对象后被删除。
我在文档和搜索引擎(例如 google、duckduckgo)中都没有找到任何相关信息。我发现的所有示例都显示 QString
和 QTextStream
具有相同的生命周期(同一函数中的局部变量),因此我不确定如果这两个对象具有不同的生命周期会发生什么。
QTextStream
没有取得 QString
的所有权。
事实上你可以这样写一个函数:
void test()
{
QString s;
QTextStream ts(&s);
///.....
}
如果 QTextStream
获得所有权,在这种情况下 QString
将被删除两次,并且会出现运行时错误。但是这段代码是正确的,所以 QTextStream
没有取得所有权
如果文档没有具体 声明 QTextStream
对象获得所有权,则可以相当安全地假设它没有。否则这将是一个非常令人讨厌的遗漏。
但如果您不相信文档会通知您,您有两个资源:阅读 source code 或测试代码中的行为。
事实证明,QTextStream
没有取得所有权,也永远不会尝试删除 QString*
。这就提出了一个问题,即为什么不将参数声明为 const QString*
,但这是另一个问题。
如果你想要 100% 的保证,我鼓励你写一个单元测试。虽然极不可能(毕竟这不是 PHP),但行为可能会在以后的版本中发生变化。