Inline Container = Speicherfresser ?
-
Hi!
Meine funktionierende Funktion schaut nun so aus:
void multiFocus (BITMAP * sur, int editCol, int blitCol, std::vector<CEditBox*> & edits) { BITMAP * temp = create_bitmap (sur->w, sur->h); blit(sur, temp, 0, 0, 0, 0, sur->w, sur->h); CEditBox * box[500]; int noOfArgs = 0; std::vector<CEditBox*>::iterator pos = edits.begin(); std::vector<CEditBox*>::iterator end = edits.end(); while(pos != end) { box[noOfArgs++] = *pos; ++pos; } for (int i = 0; i < noOfArgs; i++) { for (int j = 0; j < noOfArgs; j++) if (j != i) box[j]->blitEditBox(sur, blitCol); box[i]->focus(sur, editCol, blitCol); blit(temp, sur, 0, 0, 0, 0, temp->w, temp->h); } for (i = 0; i < noOfArgs; i++) box[i]->blitEditBox(sur, blitCol); };
Wenn ich im Taskmanager den verbrauchten Speicher beobachte, schnellt dieser in die Höhe (300 MB und mehr), wenn die Funktion in einer while(true)-Schleife läuft.
Was kann ich dagegen tun? Muss ich noch irgendwas aus dem Speicher löschen in der Funktion? Die Zeiger könnten den Speicherverbrauch verursachen. Was meint ihr?
MfG
-
BITMAP * temp = create_bitmap (sur->w, sur->h);
könnte es daran liegen?
der Destructor von vectorruft die Destruktoren aller Elemente auf, und gibt den allozierten Speicher wieder frei.Ich versteh' auch nicht ganz, warum du die vector<> - Elemente erst in ein lokale array fester Länge umkopierst.
-
Weil ich so die folgenden verschachtelten for-Schleifen einfach lösen kann.
Hmmm, vielleicht gehts auch anders.
MfG
Edit: Jo. Es waren die BITMAP-Objekte *ggg*
destroy_bitmap (temp);
Und schon is das Problem gelöst.
-
vector bietet auch den operator[] an.
statt box[j] einfach edits[j]
-
The beauty of STL
void multiFocus (BITMAP * sur, int editCol, int blitCol, std::vector<CEditBox*> & edits) { BITMAP * temp = create_bitmap (sur->w, sur->h); blit(sur, temp, 0, 0, 0, 0, sur->w, sur->h); for (int i = 0; i < noOfArgs; i++) { for (int j = 0; j < noOfArgs; j++) if (j != i) edits[j]->blitEditBox(sur, blitCol); edits[i]->focus(sur, editCol, blitCol); blit(temp, sur, 0, 0, 0, 0, temp->w, temp->h); } for (i = 0; i < noOfArgs; i++) edits[i]->blitEditBox(sur, blitCol); destroy_yaddayadsa... };