Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » Speicherleck....

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
20.09.2006, 17:07 Uhr
flappinski



Hallo Leute,
ich bin weiter auf der Suche nach Speicherlecks. Mein Programm läuft zwar sauber, aber valgrind findet noch, und ich habe das dumpfe Gefühl, dass es mit mehr Daten wieder zu Problemen kommen wird.
Die meisten Lecks finde und korrigiere ich selber. Hier eine Funktion, bei der ich allerdings das Problem nicht erkenne. Virtual, Du brauchst wahrscheinlich wieder nur einen Blick:

C++:
void read_file_exact (string inf_datei, vector<string> &line_vec) {
    stringstream log_stream("\n");
    ifstream In(inf_datei.c_str(),ios::binary);               // Datei oeffnen und Stream auf In
    if (!In) {                                 // falls Datein nicht zu oeffnen, Abbruch
    log_stream << STERNE << "Error while opening "<< inf_datei.c_str() << STERNE << "  -> Abort\n\n\n";
    abbruch(log_stream);
    }
    log_stream << "\nread " << inf_datei << "..." << endl;
    print_stream(log_stream);
    string line;
    int tabzz=0,anz13=0;
    bool first=0;
    while(getline(In, line)){
    if (!first) {             // check TABs
        tabzz= count(line.begin(),line.end(),9);
        first=1;
    }
    else if (tabzz!=count(line.begin(),line.end(),9)) {
        log_stream << "bad fieldnumber on "
               << inf_datei.c_str() << ", row: " << line_vec.size()
               << " -> Abort" << endl;
        abbruch(log_stream);
    }
    if (line.find(13,0)!=string::npos){
        line.erase(remove(line.begin(),line.end(),13),line.end()); //entferne ASCII 13
        anz13++;
    }
        line_vec.push_back(line); // Add the line to vector   ***********************************
    }
    if (anz13!=0) {
    log_stream << anz13 << " ASCII 13-Signs (Windows-Line_Feed) found and deleted. "<< endl;
    print_stream(log_stream);
    }
    log_stream << "\nfinished." << endl;
    print_stream(log_stream);
    In.close();
}




hier die Ausgabe von valgrind:


Code:
==17362== 172992 bytes in 152 blocks are definitely lost in loss record 3 of 5
==17362==    at 0x1B8FFC42: operator new(unsigned) (in /usr/lib/valgrind/vgpreload_memcheck.so)
==17362==    by 0x1B9B364A: std::string::_Rep::_S_create(unsigned, unsigned, std::allocator<char> const&) (new_allocator.h:88)
==17362==    by 0x1B9B4707: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned) (basic_string.tcc:602)
==17362==    by 0x1B9B5016: std::string::string(std::string const&) (basic_string.h:222)
==17362==    by 0x804FCDC: __gnu_cxx::new_allocator<std::string>::construct(std::string*, std::string const&) (new_allocator.h:104)
==17362==    by 0x8050B9C: std::vector<std::string, std::allocator<std::string> >::_M_insert_aux(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::string const&) (vector.tcc:279)
==17362==    by 0x8050DFA: std::vector<std::string, std::allocator<std::string> >::push_back(std::string const&) (stl_vector.h:605)
==17362==    by 0x804C231: read_file_exact(std::string, std::vector<std::string, std::allocator<std::string> >&) (Filefunc.cpp:331)
==17362==    by 0x8069A98: turn_ptgt(NSwitch&) (NTurn.cpp:84)
==17362==    by 0x8071155: main (WG_Permer_main.cpp:515)
==17362==



Ich habe die Zeile 331 aus Filefunc.cpp ("line_vec.push_back(line);") mit Sternen markiert, dann kann man sich besser zurechtfinden. Die 152 Blocks passen zu den 152 Zeilen der Datei. Wenn diese jedoch wirklich "verloren" gehen, kann das bei anderen Daten zu jeder Menge Holz führen....
Viele Grüsse und danke im Vorraus,
Stephan

Dieser Post wurde am 20.09.2006 um 17:08 Uhr von flappinski editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.09.2006, 14:04 Uhr
flappinski



Virtual? Bist Du da irgendwo? Habe ich was falsch gemacht?
Dieser Post wurde am 22.09.2006 um 14:05 Uhr von flappinski editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.09.2006, 14:31 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja ich bin da.

Das read_file_exact Speicher belegt und diesen nicht freigibt, liegt auf der Hand: die Ganzen Speicherstücke, die in Zeile 331 belegt werden, wandern ja in den Vector, welcher als Referenz übergeben wurde (und werden daher nicht unmittelbar in der Funktion selbst freigegeben).

Die eigentlich entscheidende Frage ist, was später mit dem programm passiert (read_file_exact ist IMHO sauber). Ich sehe da mehere Möglichkeiten:

1. in read_file_exact Funktion wird im Falle eines Fehlers "abbruch" aufgerufen. Für mich riecht eine Solche Funktion schwer nach der Verwendung von exit. Wird das Programm vielleicht generell mit "exit" beendet? - Das wäre gaaaaaanz dolle schlecht.

2. Die Variable, die line_vec referenziert, ist mit new angelegt, und du deletes sie nicht.

3. Die Variable, die line_vec referenziert, ist global deklariert und du verwendest einen gcc auf einer HP-UX Maschine oder ähnlichem. Da kann es auch Probleme mit dem Aufräumen geben.


Interessant wären auch die anderen 4 Records, die valgriund ausspuckt.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.09.2006, 18:34 Uhr
flappinski



Hi Virtual,
also inzwischen bekomme ich die Meldung vom Speicherleck (s.o.) nicht mehr. Frag mich nicht, warum! Die anderen Records sind bis auf zwei auch beseitigt, wovon einer kein Problem darstellt, den anderen muss ich erst mal richtig eingrenzen, dann melde ich mich wieder. Wird wohl dieses WE nix mehr. Erst mal vielen Dank für Deine Hilfe,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
26.09.2006, 16:35 Uhr
flappinski



Hi,
ich habe das Leck gefunden, acuh wenn es sehr viel Muehe gekostet hat. valgrind hat auf jeden Fall ein Leck gesehen, aber der Ort des Verslustes wurde immer wieder unterchiedlich angezeigt. Fuer andere, die unklare Lecks aufspueren wollen:
Ich habe an eine Funktion die Adresse eines Strings uebergeben, um diesen zu bearbeiten, etwas so

C++:
funk1 ( string & row) {
row[x]='1';
}


wenn jetzt x hoeher als die laenge des strings liegt, und bei mir kam das manchmal vor, dann gibt es keine fehlermeldung sondern eine Kopie des ganzen strings, die daraufhin verlorengeht.
Tja, wenn man so stuemperhaft schreibt, passiert sowas...
Viele Gruesse,
Stephan
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


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: