Arbeitsspeicher wieder frei geben ?
-
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.
-
fletscheru schrieb:
und zeig mir ein BUCH was mir die vector.cpp erklaert wie das in der fkt gehandhabt wird!
Wie kommst Du bitte auf vector.cpp? Die gibt es nicht mal unbedingt. Ich glaube nicht, daß Du den Inhalt irgendwo erklärt findest. Man braucht ja die Bücher nicht, damit sie einem alles erklären, sondern damit man sich diese Sachen selbst erklären kann.
Die Verwendung von std::vector sollte in jedem ordentlichen Einsteigerbuch drin sein. Im Stroustrup steht was dazu, im Primer mit Sicherheit auch. Ansonsten gibt's noch von Josuttis STL a Tutorial and Reference, da ist jede Methode einzeln erklärt. Ein Doku gibt's übrigens auch online, mußt mal im Forum suchen, vielleicht steht's auch in der FAQ.
Shade schreibt ein Tutorial, damit andere Leute daraus lernen können. Aber ein Tutorial ersetzt keine Bücher, es ist niemals so umfassend wie ein Buch. Dafür ist es für den Anfang vielleicht motivierender, weil schneller was richtiges programmiert wird. Aber man sollte doch in jedem Fall nach dem Genuß einiger Tutorials mal das ein oder andere Buch aufschlagen um die Grundlagen zu festigen und zu vervollständigen.
MfG Jester
-
Jester schrieb:
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?
Weil der Taskmanager nur den Prozess betrachtet. Er analysiert ihn aber nicht.
Wenn du dir 10MB Speicher besorgst und dann wieder frei gibst, kann es gut sein, dass der Taskmanager nix davon mitbekommt - weil du zB einen Allocator verwendest, der den Speicher eben noch nicht freigibt - oder sich das OS denkt: mhm, ich brauch den Speicher nicht - ich lasse ihn offiziell dem Prozess, so kann er schneller allokieren wenn er ihn doch wieder brauchen sollte.
Da würde ich lieber Memoryprofiler nehmen, valgrind zB. Allerdings habe ich damit noch nie gearbeitet, weil ich einfach keine Speicherlöcher habe
-
er denkt nur linux zeigt alles korregt an im tastmanager
korrekt
ok win ist nicht genau was das angelangt. aber es ist ein indikator
anbelangt
wenn dan eine appi 8mb in anspruch nimmt wird das in etwa stimmen.
dann; API
und wenn eine appi 20mb braucht stimmt das in etwa auch
API
und warum sind wir dann alle bloed?
Du bist es z.B., weil du kein Deutsch kannst
-
ich bemitleide dich, weil du den lieben langen tag keine andre beschäftigung hast, als die fehler anderer zu korrigieren