2

私はこのようなクラスを持っています:

class SomeClass {
    public:
        QString data;
        SomeClass(const QString &);
};

および.cppファイル内:

SomeClass::SomeClass(const QString &_data) {
    data = _data;
}

それから私はそれをこのように使います:

SomeClass c("foobar");

これにより、QString( "foobar")が呼び出され、SomeClassのコンストラクターに渡されます。ただし、このQStringは自動オブジェクトであるため、その存続期間はコンストラクターの後でなくなります。一方、data変更しない限り(Qtのドキュメントを理解している限り)コピーされません。このコードで生涯の問題が発生する可能性はありますか、それとも私は間違っていますか?それをより良く設計する方法は?

4

2 に答える 2

5

大丈夫。一時的な QString データを破棄すると変更されるため、コピーが実行されます。データの変更とは、データを参照する文字列またはデータを含む文字列のいずれかの側で変更されることを意味します。

于 2011-07-08T11:14:40.983 に答える
4

あなたのコードは大丈夫です。イベントのシーケンスは次のとおりです。

  1. const char* "foobar" をコンストラクターに渡すと、一時的な QString (xx と呼びましょう) が作成されます。
  2. data にはその文字列が割り当てられます。つまり、 data と xx の両方が文字列本体を参照し、現在は ref カウントが 2 です。
  3. xx が範囲外になり、文字列本体の参照カウントが 1 になり、データは引き続きこの本体を参照します。
于 2011-07-08T11:19:41.103 に答える