0

QTextStreamから読み取るために使用しようとしていQStringます。コンストラクターには次のシグネチャがあるため:

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

(ドキュメントを参照)

コンストラクターには生のポインターが渡されるため、オブジェクトQTextStreamの所有権を取得するか、オブジェクトの後にオブジェクトが削除さQStringれるようにコードで管理する必要があるかどうか疑問に思います。QStringQTextStream

これに関する情報は、ドキュメントにも検索エンジン (google、duckduckgo など) でも見つかりませんでした。私が見つけたすべての例は、同じ有効期間 (同じ関数内のローカル変数) を持つaQStringと aを示しているため、2 つのオブジェクトの有効期間が異なる場合に何が起こるかわかりません。QTextStream

4

2 に答える 2

3

はのQTextStream所有権を取得しませんQString

実際、次のような関数を書くことができます:

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

QTextStream所有権を取得すると、この場合はQStringが 2 回削除され、実行時エラーが発生します。しかし、このコードは正しいので、QTextStreamは所有権を取得しません

于 2016-06-09T15:36:50.997 に答える
3

オブジェクトが所有権を取得することがドキュメントに明確QTextStreamに記載されていない場合は、そうでないと想定しても問題ありません。そうでなければ、それはかなり厄介な省略になります。

しかし、ドキュメンテーションを信頼できない場合は、ソース コードを読むか、コードで動作をテストするという 2 つの手段があります。

結局のところ、QTextStreamは所有権を取得せず、QString*. これにより、パラメータが として宣言されていない理由について疑問が生じますがconst QString*、それはまったく別の問題です。

100% の保証が必要な場合は、単体テストを作成することをお勧めします。可能性は非常に低いですが (これは PHP ではありません)、後のバージョンで動作が変更される可能性があります。

于 2016-06-09T15:36:58.077 に答える