Buscar..


Observaciones

Los iteradores de estilo STL en Qt Container pueden tener algún efecto secundario negativo debido a la participación implícita. Se recomienda evitar la copia de un contenedor Qt mientras tenga iteradores activos en ellos.

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!

Concepto basico

Varios Objetos y Contenedores de Qt utilizan un concepto de intercambio implícito de calles, al que también se puede hacer referencia como copia sobre escritura .

El uso compartido implícito significa que las clases que usan este concepto comparten los mismos datos en la inicialización.

Una de estas clases para usar el concepto es QString.

QString s1("Hello World");

Una inicialización QString

Este es un modelo simplificado de una QString. Internamente tiene un bloque de memoria, con los datos reales de la cadena y un contador de referencia.

QString s2 = s1;

copiar QString

Si ahora copiamos esta QString ambos objetos apuntarán internamente al mismo contenido, evitando así operaciones de copia innecesarias. Tenga en cuenta cómo el recuento de referencia también se elevó. Entonces, en caso de que la primera cadena se elimine, los datos compartidos todavía saben que otra QString hace referencia a QString .

s2 += " and all the other Worlds!"

Copiar en escrito

Ahora, cuando la QString se modifica realmente, el objeto se "separa" del bloque de memoria, copiando su contenido y modificando el contenido.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow