Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Speicher wieder freigeben

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 < [ 2 ]
000
16.12.2003, 01:09 Uhr
~iBOT
Gast


Hi Leute,
jetzt mal eine wohl eher dumme Frage! Ich habe eine Funktion die einen Zeiger auf ein int array zurück gibt : getFiles
Nun habe ich eine zweite Funktion die in einer Endlosschleife diese Funktion immer wieder aufruft. Hierbei steigt jedoch stetig aber nicht schnell die auslastung des speichers! Da ich das Programm aber durchgehen über Monate laufen lassen möcht ist dfas nicht so toll.

Wie geht das so nicht?

C++:
    int *files=NULL;
    while (1)
    {
    QString path= "d:\\thumb\\" ;
    files = getFiles(path);
    files=NULL;
    }
    
    return 0;


Dieser Post wurde am 16.12.2003 um 01:13 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.12.2003, 01:16 Uhr
Pablo
Supertux
(Operator)


Wie funktioniert getFiles? Postet mal den Code von getFiles
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.12.2003, 01:17 Uhr
0xdeadbeef
Gott
(Operator)


Du benutzt Qt, also wohl C++. Dementsprechend gehe ich davon aus, dass der Speicher mit new angefordert wird, also mit delete wieder freigegeben werden muss (Im Gegensatz zu C, wo das mit malloc/calloc und free passiert). Der Code von getFiles wäre trotzdem interessant.

Wenn ein Array initialisiert wird, wäre also delete[] das Ding der Wahl. Dementsprechend:

C++:
int *files=NULL;
while (1)
{
  QString path= "d\thumb\\" ;
  files = getFiles(path);
  delete[] files;
  files = NULL;
}
    
return 0;


Generell gilt in C++: Der Speicher wird mit new angefordert und mit delete freigegeben. Wenn es sich um ein Array handelt, wird delete[] benutzt, ansonsten nur delete. In C ist das nicht erforderlich, weil es keine Kon- und Destruktoren gibt. Aber, wie gesagt, bei unsauberem Code muss das nicht zwingend richtig sein. Zeig mal den Code von getFiles her.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.12.2003, 01:23 Uhr
~iBOT
Gast


QT benutze ich übrigens eigentlich so gut wie gar nicht in diesem Projekt!
Wollt ich erst und das sind noch die Überreste.


C++:
int* getFiles (QString dir)
{
int *files=NULL;
    int *fail=NULL;
    //------------------Verbindung über ODBC aufbauen
    CGOdbcConnect cCon;
    try
    {
        cCon.connect("odbc", "sa", "pwd");
    }
    catch(CGOdbcEx *pE)
    {
        printf("connection error\n%s\n", pE->getMsg());
        
        return fail;
    }

    printf("Driver: %s\n", cCon.getDriver());

    // ----------------------SELECT
    CGOdbcStmt *pCur;
    pCur = cCon.createStatement();
    try
    {
        pCur->execute("select * from ----- where -----");
    }
    catch(CGOdbcEx *pE)
    {
        cCon.freeStatement(pCur);
        printf("execute query error\n%s\n", pE->getMsg());
        return fail;
    }
    //----------------------binden der Parameter
    try
    {
        if (!pCur->bindAuto())
        {
            printf("cursor doesn't contain resultset\n");
             return fail;
        }
    }
    catch(CGOdbcEx *pE)
    {
        cCon.freeStatement(pCur);
        printf("binding error\n%s\n", pE->getMsg());
        return fail;
    }
    //----------------------Übertragen in Stringlist

    files = new int[pCur->getRowCount()+1];
    
    
     try
    {
        
         bool bRC;
              
        int i=1;
        for (bRC = pCur->first(); bRC; bRC = pCur->next())
        {
        
        
            QString imdId;
            files[ i ] = pCur->getInt("imdId");
        //    printf("id\t%i\n",files[ i ]);
            files[0]=pCur->getRowCount();
            i++;

        }
     }
         catch(CGOdbcEx *pE)
    {
        cCon.freeStatement(pCur);
        printf("load cursor error\n%s\n", pE->getMsg());
         return fail;
    }

cCon.freeStatement(pCur);
        return (files);
}



Bearbeitung von 0xdeadbeef:

Etwas an den Tags rumgebastelt. damit die Darstellung hinhaut


Dieser Post wurde am 16.12.2003 um 01:26 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.12.2003, 01:25 Uhr
~iBOT
Gast


Das mit delete [] der speicher bei einem Array wieder freigegeben wir weiß ich auch aber dein Code kann doch nicht funzen wenn ich files in der Schleife wieder benutze! Weil es ja gelöscht ist!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.12.2003, 01:28 Uhr
0xdeadbeef
Gott
(Operator)


files zeigt nach delete[] irgendwo in die Gegend. Trotzdem ist der Speicher wieder freigegeben, und kann vom System wieder verwendet werden. Wenn nach delete[] noch dasselbe im Array drinsteht, ist das reiner Zufall.

Was diesen speziellen Fall angeht -Generell ist es schlechter Stil, in einer Funktion Speicher anzufordern und ihn in einer andren wieder freizugeben - Viel zu unübersichtlich. Entweder, du übergibst einen Buffer und seine Länge, oder, was in diesem Fall sinnvoller sein dürfte, weil du die Datenmenge nicht abschätzen kannst, du benutzt einen vector.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 16.12.2003 um 01:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.12.2003, 01:30 Uhr
~iBOT
Gast


Das Problem ist mit dem Code bekomme ich von Windows einen Fehler! Wegen Speicherproblem! Lösch ich den nur den Inhalt vom Zeiger oder den ganzen Zeiger mit delete [] ?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.12.2003, 01:31 Uhr
0xdeadbeef
Gott
(Operator)


Mit delete[] nimmst du nur den Inhalt vom Heap. Ihn extra zu überschreiben, würde viel zu viel Rechenzeit kosten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.12.2003, 01:33 Uhr
~iBOT
Gast


Okay! Aber trotz alle dem funzt dein Code nicht! Weitere Ideen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.12.2003, 01:34 Uhr
0xdeadbeef
Gott
(Operator)


vector bentutzen. Oder list, oder set - je nachdem, wie du nachher darauf zugreifen willst.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ 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: