Speicherbelegung von Variablen untersuchen
-
Hallo zusammen,
ich habe folgendes Problem:
Mein Programm hat die Form:int main() { int n=10; while(n<9000){ ... fkt(n); ... n=n+100; } }wobei beim jeden Durchlauf viel Daten in Speicher belegt werden.
Natürlich möchte ich nach jedem Durchlauf die Speicherbelegung gereinigt haben, weil sie von den nächsten Durchläufen nicht verwendet werden.
ich verwende delete oder clear, um ein paar Vektoren und von new erzeugte Variable zu löschen, aber wenn ich in den Verwendungsverlauf des physikalischen Speichers gucke, steigt die Linie fast monoton, also nicht in Zickzackform wie ich es gerne hätte.
Wie kann ich in MSVS gucken, was alles in Speicher sind?
danke.
-
Verwendungsverlauf des physikalischen Speichers
Diese Zahl hat (fast) überhaupt keinen Zusammenhang mit dem Speicher den dein Programm tatsächlich benutzt.
-
hi,
das z.B.#include <iostream> using namespace std; void main(){ int n=1; while (n<10000){ double* quad = new double[n*n]; quad[0]=(double)n*n; cout<<quad[0]; n++; delete quad; } system("pause"); }ist das, was ich wollte, in WindowsTask-Manager sehe ich fast konstanten Verlauf, wenn ich delete quade nicht verwende, ist der Speicher sofort voll.
-
C++-Basics:
new -> delete;
new[] -> delete[]
Du machst
new[] -> delete.
Gibst also den Speicher deines Arrays nicht korrekt frei.
Und eigentlich sollte der Speicherverbrauch nicht linear sondern quadratisch steigen.
-
x_x schrieb:
hi,
das z.B.#include <iostream> using namespace std; void main(){ int n=1; while (n<10000){ double* quad = new double[n*n]; quad[0]=(double)n*n; cout<<quad[0]; n++; delete quad; } system("pause"); }ist das, was ich wollte, in WindowsTask-Manager sehe ich fast konstanten Verlauf, wenn ich delete quade nicht verwende, ist der Speicher sofort voll.
Du hast da auch ein Speicherloch.
Merke: Wenn du mit new[] Speicher allokierst musst du immer mit delete[] den Speicher freigeben. 
Unter Windows kannst du ja mal mit
EmptyWorkingSet( GetCurrentProcess() );experimentieren.
(Du brauchst dazu <psapi.h> und musst die psapi.lib linken.)
-
Ohne sleep() in der while() Schleife ist der Speicher sogar instantan voll, da sieht man wahrscheinlich nur einen senkrechte Anstieg.
Wirklich aussagekräftige Ergebnisse erhälst du nur, wenn du einen Profiler benutzt, der deine Anwendung analysiert.
-
evilissimo schrieb:
Du hast da auch ein Speicherloch.
Merke: Wenn du mit new[] Speicher allokierst musst du immer mit delete[] den Speicher freigeben. 
Unabhängig davon, dass er natürlich einen Fehler macht und delete/delete[] passend verwenden muss: war es nicht so, dass delete auch bei Arrays funktioniert und das einzige Problem bei der Sache ist, dass keine Destruktoren aufgerufen werden, so dass bei PODs keine memleaks entstehen und trotz Programmierfehler alles glatt läuft?
-
ISO/IEC 14882:2003 schrieb:
5.3.5 Delete
The delete-expression operator destroys a most derived object (1.8) or array created by a new-expression.delete-expression:
::opt delete cast-expression
The first alternative is for non-array objects, and the second is for arrays.
...
In the first alternative (delete object), the value of the operand of delete shall be a pointer to a non-array object or a pointer to a sub-object (1.8) representing a base class of such an object (clause 10). If not, the behavior is undefined.
-
_matze schrieb:
Unabhängig davon, dass er natürlich einen Fehler macht und delete/delete[] passend verwenden muss: war es nicht so, dass delete auch bei Arrays funktioniert und das einzige Problem bei der Sache ist, dass keine Destruktoren aufgerufen werden, so dass bei PODs keine memleaks entstehen und trotz Programmierfehler alles glatt läuft?
Was du wahrscheinlich meinst, ist
operator deletebzw.operator delete[], also die Funktionen für reine Speicherfreigabe ohne Zerstörung – ähnlich wiefree()in C.