Speicherloch ifstream ??



  • ich habe eine Funktion geschrieben, die prüft ob ein File existiert.
    Im Memorydump des Studios bekomme ich jedoch ein Speicherloch angezeigt das durch
    die open-Funktion von ifstream zu entstehen scheint.
    Ich kann mir nicht vorstellen das diese Funktion ein Leak hat, was ist falsch ?

    hier der code

    // mystring ist eine eigene Stringklasse
    bool Global::Exist(mystring file) {
    	bool bExist = false;
    
            // Konvertieren in char*
    	char *pcFile = Global::Conv_pwc2pc(file);
    
      ifstream test;
    
    	// hier entsteht wahrscheinlich ein Speicherloch 
    	// mit dem VCStudio kann es lokalisiert werden indem z.B.
    	// vorher ein Speicher der Größe X und nachher ein Speicher der Größe Y
    	// reserviert wird der nicht freigegeben wird.
    	// im MemoryDump ist dann zwischen den Speicherlöchern X und Y das 
    	// Speicherloch zu sehen das durch diese Zeile erzeugt wird
    	// der Code zum generieren der Speicherlöcher ist bewußt dringelassen, jedoch auskommentiert
    	//new char[1051];
      test.open (pcFile);
    	//new char[1052];
    
      if (test.is_open()) {
        if (test.good()){
    			bExist = true;
    		} 
        test.close();
      } else {
      }
    
    	free(pcFile);
    
    	return bExist;
    }
    


  • Hallo Rufus,

    beim Visual Studio .Net 2003 alias VC7 kann ich das von Dir geschilderte Verhalten nicht nachvollziehen. Welche Version benutzt Du?



  • Ich benutze Visual Studio 6.0!

    Gruss Rufus



  • Mit welchem Befehl wird für pcFile speicher reserviert und mit welchem Befehl gibst du ihn wieder frei?



  • Hallo Rufus,

    es wird tatsächlich Speicher allokiert, der vor dem return im main() noch nicht wieder frei gegeben wurde. Auch dann wenn das in irgendeinem Unterprogramm stattfindet.
    Aber ich meine es handelt sich um 'einmaligen'Speicher (einmal 512 und einmal 16 Byte). D.h. es ist egal wie oft Du file.open() wiederholst oder wie viele ofstream-Objekte vorhanden sind, es wird nicht mehr Speicher allokiert. Wahrscheinlich interne Singletons, die nie wieder gelöscht werden.
    Setze vor Deinen Code (vielleicht im main()) mal

    int main()
    {
        {
            std::ifstream file;
            file.open( "input.txt" ); // irgendeine Datei
        }
        // usw...
        return 0;
    }
    

    Dann sollte zwischen den Speicherlöchern X und Y (s. Dein Posting) kein Memory Leak mehr zu finden sein.

    Gruß
    Werner


Log in to reply