QList<double*>, implicit sharing, Liste abbauen
Verfasst: 4. August 2011 16:07
In meiner Anwendung benutze ich eine Anzahl von double Arrays konstanter Länge, die ich in QList<double*> zusammenfasse. Unterwegs kopiere ich mal von einer QList<double*> in eine andere, und ich frage mich gerade, ob ich danach die QList auch wieder korrekt abbaue. Konkret sieht das in einer vereinfachten Version so aus:
Ich habe den Eindruck, dass beide Versionen das gewünschte Ergebnis (d.h. ursprüngliche Daten in dataList vorhanden, Daten nur einmal im Speicher vorhanden, tempList kann mit clear abgebaut werden, ohne dataList zu beeinflussen) bringen, bin mir aber nicht sicher, ob ich das richtig verstanden habe.
Nachdem ich in der zweiten for Schleife die tempList gefüllt habe, sind die Daten noch nicht dupliziert worden, ich habe jetzt lediglich 2 QList mit den Zeigern auf die jeweils gleichen double Arrays, oder? Führe ich nun in Version 2 das clearVectorList(...) aus, dann wird zwar dataList vollständig abgebaut, die Daten können somit aber nicht mehr von tempList geshared werden und werden deshalb dabei neu angelegt?
Im Gegensatz dazu werden in Version 1 nur die Zeiger in dataList gelöscht und die eigentlichen Daten (das double Array) werden nach der Zuweisung dataList = tempList; wieder geshared?
Weiß jemand, was da genau hinter den Kulissen passiert?
Code: Alles auswählen
QList<double*> dataList;
QList<double*> tempList;
double* element;
// Eigentliche Datenliste erstellen
for ( int i = 0; i < anzahl; i ++ ) {
element = new double[laenge];
fillWithData(element);
dataList.append(element);
}
// Datenliste in temporäre Liste kopieren
for ( int i = 0; i < anzahl; i ++ )
tempList.append( dataList.at(i) );
// Jetzt Datenliste löschen und die temporäre Liste wieder in die Datenliste kopieren.
// Version 1
dataList.clear();
dataList = tempList;
// Version 2
clearVectorList( dataList );
dataList = tempList;
void clearVectorList(QList<double*>& list) {
for ( int i = 0; i < list.size(); ++i)
delete[] list[i];
list.clear();
}
Nachdem ich in der zweiten for Schleife die tempList gefüllt habe, sind die Daten noch nicht dupliziert worden, ich habe jetzt lediglich 2 QList mit den Zeigern auf die jeweils gleichen double Arrays, oder? Führe ich nun in Version 2 das clearVectorList(...) aus, dann wird zwar dataList vollständig abgebaut, die Daten können somit aber nicht mehr von tempList geshared werden und werden deshalb dabei neu angelegt?
Im Gegensatz dazu werden in Version 1 nur die Zeiger in dataList gelöscht und die eigentlichen Daten (das double Array) werden nach der Zuweisung dataList = tempList; wieder geshared?
Weiß jemand, was da genau hinter den Kulissen passiert?