Freier Speicher, der von einer std :: string verwendet wird

8

Ich habe ein struct , das so aussieht:

%Vor%

Ich habe eine std::vector< queue_item_t > , die mit vielen von diesen aus einer Datenbankabfrage gefüllt ist.

Wenn jedes Element verarbeitet wird, wird eine Datei von der Festplatte gelesen und ihr Inhalt in das content -String-Member eingefügt. Das Objekt wird verarbeitet ( content wird analysiert) und ich führe .clear() auf dem String aus, um nicht all meinen Speicher zu verbrauchen.

Dies scheint jedoch nicht die Erinnerung zu befreien. Ich habe Hunderttausende von Artikeln verarbeitet und schließlich wird die Speicherauslastung über das hinausgehen, was verfügbar ist, und die Anwendung wird von Linux mit "Out-of-Memory" als Grund getötet.

Wie kann ich den von diesen Strings verwendeten Speicher freigeben?

    
Thomas Daugaard 11.06.2012, 11:02
quelle

4 Antworten

15

std :: string und std :: vector ändern nicht die Containerkapazität (= & gt; geben Sie keinen Containerspeicher frei) in clear (). Der folgende Trick mit temporärem Objekt sollte verwendet werden, wenn eine Komprimierung erforderlich ist (normalerweise ist dies nicht erforderlich).

%Vor%

obigen Code kann einfacher gemacht werden, wenn Reinigung + Verdichtung erforderlich sind:

%Vor%

Einige String-Implementierungen sind Copy-on-Write. Eine solche Zeichenfolge würde, wenn sie von mehr als einer Stelle aus aufgerufen wird, den Speicher beim Schreiben neu zuweisen.

    
bobah 11.06.2012, 11:04
quelle
1

clear befreit nicht all den Speicher der Zeichenfolge (wahrscheinlich nur der Puffer). Es wird nur die Zeichenfolge auf eine leere setzen.

Wenn Sie in der Zeichenfolge clear aufrufen können, warum nicht stattdessen verwenden? Anstatt also ein neues queue_item_t zu erstellen, ersetzen Sie einfach das Zeichenfolgenelement durch den neuen Wert.

    
Luchian Grigore 11.06.2012 11:06
quelle
1

Um Speicher freizugeben, können Sie einfach Folgendes tun:

%Vor%

Die Methode shrink_to_fit() wird den Speicher freigeben und genügend Platz für den neuen Wert von my_queue_item.content (15 Byte für diesen Fall) reservieren.

    
Hayk Tepanyan 18.08.2013 12:55
quelle
0

clear darf den Speicher nicht freigeben. Es wird die Zeichenfolge logisch auf eine leere Zeichenfolge festlegen, aber den bereits zugewiesenen Speicher nicht beeinträchtigen.

Wenn Sie mehr Daten in dasselbe queue_item_t lesen, sollte der vorherige Zeichenfolgeninhalt ersetzt werden.

Sind Sie sicher, dass Sie die queue_item_t nicht selbst verlieren?

    
chr 11.06.2012 11:09
quelle

Tags und Links