Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » problem bei Speicherfreigabe

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
14.05.2011, 13:37 Uhr
~gast321
Gast


Morgen,

ich habe ein Problem den Speicher eines dynamisch erzeugten Feldes von Pointern auf eine Klasse wieder freizugeben. Die Klasse habe ich bereits auch Speicherlecks untersucht und keine gefunden. Habe nun die wesentlichen Punkte zusammenkopiert:


C++:
#include <iostream>

class Test {
    long zahl;
public:
    Test( long wert ) : zahl(wert) {}
    void print() {std::cout << zahl;}
};


int main() {
    
    const long bucketArrayLen = 30000000;
    
    Test** bucketArray;
    
    bucketArray = new Test*[bucketArrayLen];
    for(long i=0; i<bucketArrayLen; ++i)
        bucketArray[i] = new Test(i);
    
    int stop;
    std::cout << "::::" << std::endl;
    std::cin >> stop;
    
    for(long i=0; i<bucketArrayLen; ++i)
        delete bucketArray[i];
        
    std::cout << "::::" << std::endl;
    std::cin >> stop;
    
    delete [] bucketArray;
    
    std::cout << "::::" << std::endl;
    std::cin >> stop;
    
}


Es wird zwar etwas, aber leider nicht aller Speicher freigegeben.

mfg
gast321
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.05.2011, 15:02 Uhr
TOSHMAX



Hi,

außer dass das "return 0" fehlt, enthält dein Code keine Speicherlecks.
Wie kommst du darauf, dass da was nicht stimmt, bzw mit welchem Tool?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.05.2011, 16:18 Uhr
~gast321
Gast


hallo TOSHMAX,

wenn ich den Codeausschnitt von oben bei mir kompiliere und während der Ausführung die Auslastung des Arbeitsspeichers beobachte, so ergibt sich folgendes:

Nach dem Start dauert es einen Augenblick bis die Auslastung um um einige Prozent steigt.
Nach Eingabe einer beliebigen zahl, wird
C++:
for(long i=0; i<bucketArrayLen; ++i)
        delete bucketArray[i];
ausgeführt, was allerdings nichts an der Auslastung verändert.
Erst nach
C++:
delete [] bucketArray;
wird zwar einiger, allerdings nicht aller, angeforderte Speicher freigegeben.

Die Speicherauslastung sinkt erst dann auf den gewollten Normalwert, wenn das Programm durch die Eingabe der letzten Zahl beendet wird.

mfg
gast321
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.05.2011, 18:23 Uhr
0xdeadbeef
Gott
(Operator)


Ich gehe davon aus, dass du einige Allokationen vornehmen kannst, ohne dass der Speicherbedarf wieder steigt. Das Betriebssystem weist dem Prozess stumpf Pages zu, holt sich diese aber nicht unbedingt sofort zurück, wenn der Prozess sie nicht mehr benutzt - so sinkt der Arbeitsaufwand, wenn der Prozess erneut Speicher anfordert. Es bedeutet auch, dass das, was das Betriebssystem dir als benutzten Speicher ausweist, nur sehr begrenzt zur Diagnose von Speicherlecks geeignet ist.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: