Qt
Implicit delning
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");
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;
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!"
När QString
faktiskt modifieras "lossar" objektet sig från minnesblocket, kopierar dess innehåll och modifierar innehållet.