Ricerca…


Osservazioni

Gli iteratori di stile STL su Qt Container possono avere un effetto collaterale negativo a causa della condivisione implicita. Si consiglia di evitare di copiare un contenitore Qt mentre sono attivi su iteratori.

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!

Concetto di base

Diversi oggetti e contenitori Qt usano un concetto che chiama la condivisione implicita , che può anche essere chiamata copia-su-scrittura .

Condivisione implicita significa che le classi che usano questo concetto condividono gli stessi dati sull'inizializzazione.

Una di queste classi per usare il concetto è QString.

QString s1("Hello World");

Un'inizializzazione di QString

Questo è un modello semplificato di QString. Internamente ha un blocco di memoria, con i dati di stringa effettivi e un contatore di riferimento.

QString s2 = s1;

copia QString

Se ora copiamo questo QString entrambi gli oggetti puntano internamente allo stesso contenuto, evitando così operazioni di copia non necessarie. Nota come anche il conteggio dei riferimenti è aumentato. Quindi, nel caso in cui la prima stringa venga cancellata, i dati condivisi sanno ancora di essere referenziati da un altro QString .

s2 += " and all the other Worlds!"

Copia su Scrivi

Ora, quando QString viene effettivamente modificato, l'oggetto "si stacca" dal blocco di memoria, copiandolo e modificando il contenuto.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow