Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Speicherauslastung beim Erzeugen & Löschen von Pointern

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.11.2020, 19:01 Uhr
Phi



Hallo liebe Community,

ich stehe derzeit etwas auf dem Schlauch bzgl. der Speicherauslastung bei der Nutzung von Pointern. Grundsätzlich ist ein Pointer erstmal nix anderes als ein Adresse, welche den Inhalt eines Objektes X beinhaltet.

Über new lässt sich ja solch eine Speicherreservierung manuell vornehmen. Diese muss dann über delete wieder freigegeben werden um Speicherlecks zu vermeiden.

Da ich mit Visual Studio 2015 arbeite, habe ich dort das Diagnosetool verwendet um mir die Heapauslastung anzuschauen. Im meinem eigentlichen Programm habe ich festgestellt, dass im Prozessablauf dieser Speicher immer mehr gefüllt wird (welches ich mir erklären kann, da einige Instanzen einer Klasse dynamisch erzeugt werden), jedoch nicht freigegeben wird (über eine Tasteneingabe lösche ich sämtliche erzeugte Instanzen).

Daher habe ich ein kleines Testprogramm geschrieben um genauer zu verstehen was mir das Diagnosetool anzeigt.


C++:
int main()
{

1)    std::cout << "Start program" << std::endl;

    int* a = new int;
    int* b = new int;

2)    std::cout << "Created pointers!" << std::endl;

    delete b;

3)    std::cout << "Deleted 'b'" << std::endl;

4)    std::cin >> *a;

5)    delete a;

6)    std::cout << "Deleted 'a'" << std::endl;

    return 1;
}



Die Punkte an den Zeilenanfängen sind meine Haltepunkte, an welche ich die Momentaufnahmen der Speicherauslastung genommen habe.
Das Diagnosetool meldet mir dann die folgenden Veränderungen (https://www.bilder-upload.eu/bild-43fac8-1605462833.png.html).

Dort lässt sich erkennen, dass beim Erzeugen der Integer-Pointer insgesamt 0,08 KB (2) belegt werden (sprich 0,04 KB pro Pointer). Wenn der Pointer b gelöscht wird (3), werden auch exakt 0,04 KB freigegeben.
Jetzt kommt einer der Punkte, den ich nicht nachvollziehen kann. Bei Punkt 4) wird in der Wert des Pointers a auf 1 gesetzt. Dadurch werden dann anscheinen 4,34 KB belegt. Wieso kommt es dazu? Oder ist meine Annahme falsch, dass genügend Speicher für einen Integer reserviert wurde (mit den 0,04 KB) und der wird erst bei der Wertzuweisung erweitert?
Falls dies aber der Fall ist erklärt sich mir dann aber nicht, warum an Punkt 6) wieder nur 0,04 KB freigegeben werden.

Ich hoffe ich habe die richtige Stelle hier im Forum für meine Frage erwischt, falls nicht gerne verschieben

Viele Grüße,

Phi

Dieser Post wurde am 15.11.2020 um 19:02 Uhr von Phi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.11.2020, 09:14 Uhr
ao

(Operator)



Zitat:
Bei Punkt 4) wird in der Wert des Pointers a auf 1 gesetzt. Dadurch werden dann anscheinen 4,34 KB belegt. Wieso kommt es dazu? Oder ist meine Annahme falsch, dass genügend Speicher für einen Integer reserviert wurde (mit den 0,04 KB) und der wird erst bei der Wertzuweisung erweitert?

Der Speicher für den Integer wurde bereits am Anfang (bei int * a = new int;) reserviert, deine Annahme ist richtig.

Vermutlich sind die 4 KB von der IO-Bibliothek angefordert worden, um Platz zu haben, in dem die Eingaben von std::cin (Folge von Zeichen) in einen numerischen Wert umgewandelt wird. Und vermutlich ist die Bibliothek so programmiert, dass sie solchen Platz nicht sofort wieder freigibt, sondern festhält in der Erwartung, dass noch mehr Eingaben verarbeitet werden müssen.

Lass mal die Eingabe außen vor und schreib *a=1; anstelle von std::cin>>a;
Wie verhält sich der Speicher dann?

Dieser Post wurde am 19.11.2020 um 09:14 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.11.2020, 20:05 Uhr
Phi



Hallo ao,

vielen Dank für die Antwort. Das ergibt natürlich Sinn.
Ich habe das Programm mal von einer Zuweisung über std::cin zu einer direkten im Programmcode (*a = 1) geändert. Damit verschwinden dann auch die unerklärlichen 4 KB an Speicher die reserviert wurden.

Ich vermute der Anstieg bei meinem eigentlichen Programm wird dann auch eine ähnliche Ursache haben. Ich werde mich die kommenden Tage damit weiter beschäftigen.

Grüße Phi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: