Ich habe das folgende Problem festgestellt, und ich bin nicht wirklich sicher, ob ich falsch liege oder es ist ein wirklich seltsamer Bug. Ich fülle ein riesiges Array von Strings und möchte, dass es an einem bestimmten Punkt gelöscht wird. Hier ist ein minimales BeispielVektor <string> Speicher nicht gelöscht nach außerhalb des Bereichs
#include <string>
#include <vector>
#include <unistd.h> //sleep
#include <iostream>
int main(){
{
std::vector<std::string> strvec;
for(long i = 0; i < 1000000; ++i){
std::string out = "This is gonna be a long string just to fill up the memory used by this fucking pthread\n";
strvec.push_back(out);
}
std::cout << "finished loading 1st\n";
sleep(10); // to monitor any changes
}
std::cout << "out of scope\n";
sleep(10);
return 0;
}
Mein Problem ist, wenn ich die Speichernutzung mit ‚top‘ überwachen, die Speichernutzung verringert sich nur um einen sehr kleinen Betrag (ich glaube, es ist wahrscheinlich der Vektor-Overhead), aber die meisten scheint nicht befreit. Wie kommt es? Ich testete das gleiche Szenario mit "Long Long", aber hier lief alles richtig.
Die std :: vector-Referenz besagt, dass, wenn die enthaltenen Werte keine Zeiger sind, die Destruktoren aufgerufen werden. Scheint nicht wahr für Schnur obwohl ...
Ich schätze jede Antwort.
(der Einfachheit halber: ich bin mit Debian Linux 64Bit mit g ++ 4.7.2)
EDIT: Danke für die bisherigen Antworten.
Ich habe jetzt profile Haufen Verwendung mit Vagrind-Massiv, und (ja, eigentlich wie erwartet) es wird richtig befreit an dem Punkt, den es sollte. Aber warum sehe ich tatsächlich eine Änderung in der Verwendung mit einer riesigen Ganzzahl, aber nicht mit den Strings (auch oben)?
Ich muss ein wenig beträchtlich darüber sein, weil ich in der Lage sein, meinen Speicher zu bestimmten Zeiten für eine Multithread-Server-Anwendung freizugeben, die wahrscheinlich mehrere Wochen oder mehr ohne Neustart ausgeführt wird. Wann weiß ich eigentlich, wann der C++ - Speichermanager beschließt, dem Betriebssystem etwas mitzuteilen?
Versuchen Sie das Debuggen mit [Valgrind] (http://valgrind.org/) es wird Ihnen sagen, ob Speicher frei ist oder nicht, und wäre wahrscheinlich hilfreicher als "top". – Couchy311
Was ist es mit dem Beharren der Leute, dass die Erinnerung verschwendet wird? Freier Speicher macht * nichts * - es ist nicht besser als Speicher, der überhaupt nicht im Computer ist. Nur Speicher, der * in Gebrauch ist, tut etwas Gutes. –