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...
    };
    

Anmelden zum Antworten