Sök…


Anmärkningar

STL-iteratorer på Qt Container kan ha en viss negativ biverkning på grund av implicit-delning. Det rekommenderas att undvika att kopiera en Qt-behållare medan du har iteratorer aktiva på dem.

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!

Grundläggande koncept

Flera Qt-objekt och containrar använder ett koncept som kallar implicit delning , vilket också kan kallas copy-on-write .

Implicit delning innebär att klasserna som använder detta koncept delar samma data om initialisering.

En av dessa klasser för att använda konceptet är QString.

QString s1("Hello World");

En QString-initialisering

Detta är en förenklad modell av en QString. Internt har det ett minnesblock, med verkliga strängdata och en referensräknare.

QString s2 = s1;

kopiera QString

Om vi nu kopierar denna QString båda objekt internt att peka på samma innehåll och därmed undvika onödiga kopieringsoperationer. Lägg märke till hur referensräkningen också blev upp. Så om den första strängen raderas, vet delade data fortfarande att de hänvisas till av en annan QString .

s2 += " and all the other Worlds!"

Kopiera på Skriv

När QString faktiskt modifieras "lossar" objektet sig från minnesblocket, kopierar dess innehåll och modifierar innehållet.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow