サーチ…
備考
Qtコンテナ上のSTLスタイルのイテレータは、暗黙的な共有のためにいくつかの負の副作用を持つ可能性があります。 Qtコンテナをイテレータでアクティブにしている間は、Qtコンテナをコピーしないようにすることをお勧めします。
QVector<int> a,b; //2 vectors
a.resize(1000);
b = a; // b and a now point to the same memory internally
auto iter = a.begin(); //iter also points to the same memory a and b do
a[4] = 1; //a creates a new copy and points to different memory.
//Warning 1: b and iter point sill to the same even if iter was "a.begin()"
b.clear(); //delete b-memory
//Warning 2: iter only holds a pointer to the memory but does not increase ref-count.
// so now the memory iter points to is invalid. UB!
基本コンセプト
いくつかのQtオブジェクトとコンテナは、コンセプトを使用して暗黙の共有を呼び出します。これは、 コピーオンライトとも呼ばれます 。
暗黙の共有とは、この概念を使用するクラスが初期化時に同じデータを共有することを意味します。
概念を使用するこれらのクラスの1つは、QStringです。
QString s1("Hello World");
これは、QStringの単純化されたモデルです。内部的にはメモリブロックを持ち、実際の文字列データと参照カウンタを持ちます。
QString s2 = s1;
このQString
コピーすると、両方のオブジェクトが内部的に同じコンテンツを指しているため、不要なコピー操作が回避されます。参照カウントもまたどのように上昇したかに注意してください。したがって、最初の文字列が削除された場合でも、共有データはそれが別のQString
によって参照されていることが分かります。
s2 += " and all the other Worlds!"
QString
が実際に変更されると、オブジェクトはメモリブロックから自身を「切り離し」、コンテンツをコピーして内容を変更します。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow