Arbeitsspeicher wieder frei geben ?
-
hmmm also ich loesche immer
mit clear()damit mueeste es gehen.
oder vernichte ihn und erstelle neu ( notfalls ) wenn es dann nicht geht. hmmm
-
Ja wo ??
im Destruktor ??
-
dein log trace tust ja wahrscheinlich in einer schleife die staendig lauft und die daten tracen tut, oder?
und darin kannst ja ueberpruefen ob der vec schon ( z.b.) 1000 eintrage enthaelt. wenn das so ist, dann kopiere den inhalt in eine meinelogs.log datei
musst halt schauen obs von der zeit hinhaut, nicht dass du alle paar 0.02 sec etwas tracen tust. kannst ja mit 2 vec arbeiten und mit timern steuern, falls es time probs gibt.
also wenn 1000 gross dann kopiere in datei dann leere vec und fuele wieder
dann duerfte es keine probs mit dem arbeitsspeicher geben.
oder verstehe ich dich irgendwie falsch????
-
äh?
Wie wäre es mit einem:for(int i=0;i<vLogDatenListe.size();++i) delete vLogDatenListe[i];
-
mmmmhhhh......
funktioniert alles nicht.
Noch zur Info,
ich starte ein thread in dem ich eine funktion aufrufe, dieein file öffnet und daten in einen vector schreibt.
Dann wird der Inhalt des Vectors in die datenbank geschrieben
dann sollte der vector gellert werden.Ende der Funktion
nächster aufruf des thread gleiche Funktion.
Mein Arbeitsspeicher steigt und steigt kontinuirlich.... ?????
Gruß
andy_mannp.s.
mit
for(int i=0;i<vLogDatenListe.size();++i) delete vLogDatenListe[i];
bekomme ich eine Fehlermeldung dass er nicht auf einen Speicherbereich lesen kann.
Das einzige funzt mit
vLogDatenListe.clear(); od. vLogDatenListe.erase(vLogDatenListe.begin(), vLogDatenListe.end());
-
hmmm
dat ist komisch
also nach dem .clear ist der vec wieder leer, aber es ist trozdem speicher (ram) noch besetzt. welches betriebssystem verwendest du?
also weiss auch nicht warum das delete nicht geht
aber macht es einen unterschied wenn du es so machst?
for(int i = vLogDatenListe.size() ;i > 0); i--) delete vLogDatenListe[i]; //oder for( int i = 0; vLogDatenListe.size(); i++) vLogDatenListe.pop_back();
eigentlich muesste sich das Betriebssystem darum kuemmern
wenn nicht gibts da auch ne fkt. die den speicher in der Betriebssystemliste wieder leeren tut ( aufraeumen laesst ). weiss aber nicht grad wie die heisst
bitte korigiert mich falls ich falsch liege
-
Hallo,
ich benütze WIN2K.
Habe es aber auch schon auf XP Probiert und mehrere Maschinen.
Über all das selbe.Also mit
for( int i = 0; vLogDatenListe.size(); i++) vLogDatenListe.pop_back();
gibt es keine Fehlermeldung mehr.
Mit dem anderen schon.Ich habe jetzt meine Funktion manuell gestartet.
Die laenge mir anzeigen lassen.
Sie ist defenetif am anfang gefüllt, dann ist sie 0.Aber mein Speicher erhöht sich bei jedem umlauf um ca. 100 bis 200 Kb.
Kann es eventuell an der Datenbank liegen ??
Ich mache einen conect auf die Datenbank (ADO) schließe aber in der Funktion dann diese wieder.Noch was, Beim Start meines Programmes, ist die Speicherbelegung 3,5 MB groß.
Öffne ich ein Dialog, schnellt es auf 8-9 MB.
Im Dialog öffne ich eine Datenbank.Gruß
andy_mann
-
naja das mit popback ist nicht so der hit, da es linear ist (n)
clear musste atomar (1) sein von der zeit her. das resultat muesste ja das gleiche sein
aber im tastmanager kannst doch schauem welche appi wieviel usen tut und kannst ja mal den speicherverlauf ansehen und wann diese hoch ist und wann nicht.
aber schau in google nach wie man win dazu bring den speicher zu raeumen. ausser die DB nimmt soviel in anspruch, was normalerweise nicht sein sollte.
-
Sorry, aber:
Habt ihr so absolut keinen Plan von Speicherverwaltung, oder was ist los ?!
popback ruft doch kein delete auf! Meine Güte, genauso wenig wie ein erase. Wenn dein delte fehlschlägt, dann haste irgendwo was mit dem Zeiger gemacht, was nciht erlaubt ist!
-
dann erklaers mit mal bitte
wenn ich ein array habe
z.b.
int ar[10];
dann reserviere ich doch 10 int werte auf dem ram. also im normalfall
10*2bytes = 20 bytes
beim vec ist doch das gleiche und ich kann dann dynamisch mit pushback doch den speicherplatz erhoehen
also tue ich doch dynamisch den speicherplatz mit popback reduzieren
z.b. bei size von 1000 und ich mach 100 mal pop dann sorgt doch die fkt dass nur noch 900 reserviert sind oder???? und 100 wieder freigegeben werden.
und bei clear habe ich quasi nur noch ein vector<int> test;
wenn ich jetzt test.size mache kommt doch -1 raus
und du meinst im ram sind noch 1000 ints belegt???
kannst mir das erklearen bitte?? ich dacht immer das pop oder clear kuemmert sich drum und mann muss nicht selbst delete machen.
hmmm muesste ich mir mal die implementation anschauen.
also bin mal gespannt, ich lerne gerne dazu
-
Dieser Thread wurde von Moderator/in Unix-Tom aus dem Forum MFC mit dem Visual C++ in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
fletscheru schrieb:
dann erklaers mit mal bitte
Ein Buch würde das auch tun
wenn ich ein array habe
z.b.
int ar[10];
dann reserviere ich doch 10 int werte auf dem ram. also im normalfall
10*2bytes = 20 bytes
Blödsinn.
das Array liegt auf dem Stack.
sizeof(int) sind bei 32Bit systemen 4 Bytebeim vec ist doch das gleiche und ich kann dann dynamisch mit pushback doch den speicherplatz erhoehen
also tue ich doch dynamisch den speicherplatz mit popback reduzieren
- wäre der vector dumm, wenn er bei popback speicher freigeben würde.
- reden wir hier von 2 verschiedenen sachen
vector<int> vec(10) == int arr[10];
wenn du die Elemente des vectors dynamisch allokierst:
vector<int*> vec(10);
vec.push_back(new int(4));
Dann ist das dem Vector egal. er ruft den Dtor des Objektes auf - und was macht der Dtor von int*? Garnix.wenn ich jetzt test.size mache kommt doch -1 raus
das bezweifle ich. denn vector<>::size() liefert einen unsigned typ
hmmm muesste ich mir mal die implementation anschauen.
ne, ein Buch lesen.
btw: wer sich im Taskmanager den RAM Verbrauch anschaut und analysieren will, hat keine Ahnung.
-
fletscheru schrieb:
dann erklaers mit mal bitte
wenn ich ein array habe
z.b.
int ar[10];
dann reserviere ich doch 10 int werte auf dem ram. also im normalfall
10*2bytes = 20 bytes
Nein es sind 40 bytes die reserviert werden. Du arbeitest doch bestimmt
auf einem 32-Bit System.fletscheru schrieb:
beim vec ist doch das gleiche und ich kann dann dynamisch mit pushback doch den speicherplatz erhoehen
also tue ich doch dynamisch den speicherplatz mit popback reduzieren
z.b. bei size von 1000 und ich mach 100 mal pop dann sorgt doch die fkt dass nur noch 900 reserviert sind oder???? und 100 wieder freigegeben werden.
und bei clear habe ich quasi nur noch ein vector<int> test;
clear() ruft zwar den Destruktor von jedem Element auf, es verringert
aber meines wissens nach nicht die Groesse des vectors. Mit pop_back entfernst
du lediglich das letzte Element aus dem vector, sonst nichts.fletscheru schrieb:
wenn ich jetzt test.size mache kommt doch -1 raus
und du meinst im ram sind noch 1000 ints belegt???
kannst mir das erklearen bitte?? ich dacht immer das pop oder clear kuemmert sich drum und mann muss nicht selbst delete machen.
hmmm muesste ich mir mal die implementation anschauen.
also bin mal gespannt, ich lerne gerne dazu
Schau in dein 'include'-Verzeichnis. Der Code steht in der Datei 'vector'.
mfg
v R
-
Blödsinn.
das Array liegt auf dem Stack.Und was denkst du, wo der Stack liegt du Schlauberger?
-
schadeOfMein schrieb:
Blödsinn.
das Array liegt auf dem Stack.Und was denkst du, wo der Stack liegt du Schlauberger?
Das ist aber keine konkrete Aussage und noch weniger ist es ein Grund dafuer,
diesen Tonfall anzuwenden.mfg
v R
-
schadeOfMein schrieb:
Und was denkst du, wo der Stack liegt du Schlauberger?
Woher soll ich das wissen? Vielleicht im RAM, vielleicht direkt im Prozessor Cache? Oder auf der Festplatte? Auf einem Flashspeicher?
Warum ist das wichtig?
-
naja
aber die buecher ( die du so magst )
sagen mir aber dass bei 32bit systemen unter C das 2 byte sind. double hat 4.
und diese buecher sagen einem das bei java int 4 sind. tja und ich sagte auch "im normalfall" (( wer lesen kann ist klar im vorteil ))
und warum baust du dann ein toturial auf wenn die leute eh lieber ein buch kaufen sollen.
und erklaerungen aus einem forum oder evetl. toturial schlechter sein sollen.na gut dann reserviere ich dann 2 (4) auf dem stack ( im cache oder sonstwo ). aber reserviert ist reserviert! mazbe auch auf der virtuellen auslagerungsdatei auf c: Z.B.
und zeig mir ein BUCH was mir die vector.cpp erklaert wie das in der fkt gehandhabt wird!
-
Shade Of Mine schrieb:
btw: wer sich im Taskmanager den RAM Verbrauch anschaut und analysieren will, hat keine Ahnung.
Kannst Du mir kurz erklären, warum ich doof bin, wenn ich auf dem Weg bemerke, daß ich ein Speicherloch habe?
-
er denkt nur linux zeigt alles korregt an im tastmanager
und windows ist zu bloed dafuer
ok win ist nicht genau was das angelangt. aber es ist ein indikator
wenn dan eine appi 8mb in anspruch nimmt wird das in etwa stimmen.
und wenn eine appi 20mb braucht stimmt das in etwa auch
und warum sind wir dann alle bloed?
und was machen die leute die ahnung haben ( unter win xp z.b. )
und PS. virtuell realisticer, danke das du nicht so rum lamest wie der andere sondern vernuepftige und gute antworten abgibts und nicht gleich einen auf schlaubi ( ich bin allwissend ) rumtust. merci
-
Im Taskmanager lassen sich IMO nur Speicherlecks ausmachen, die wirklich auffällig sind.
Wenn mir ein paar kb durch die Lappen gehen, merk ich das im Taskmanager vermutlich nicht, weil der Heap für das Programm vielleicht gar nicht vergößert wird. Wenn es sich um ein größeres Leak handelt, oder sich das mit der Zeit ansammelt, dann könnt ihr vielleicht den Schluss ziehen, dass euer Programm leakt, aber nicht wo. -> IMO immer noch unbrauchbar.Für sowas gibt es Memory Profiler und Funktionen, die die Compilerhersteller mitliefern (sollten), damit kann man Leaks besser aufspüren. Oder man benutzt einen Garbage Collector.
=> Wer sich im Taskmanager den RAM Verbrauch anschaut und analysieren will, tut sich schwer.