none
FindFirstFile - FindNextFile RRS feed

  • Frage

  • Hallo liebe Community,

    ich führe in meinem Programm eine rekursive Pfadanalyse durch mit folgender Funktion:

    void PathAnalyse(CHAR *Path)
    {
    	WIN32_FIND_DATA FD = {0};
    	HANDLE hFind = FindFirstFile(Path, &FD);
    	UINT Size = strlen(Path);
    
    	do
    	{
    		if(FD.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    		{
    			if(!strcmp("..", FD.cFileName)) continue;
    			if(!strcmp("." , FD.cFileName)) continue;
    
    			CHAR *Pfad = new CHAR[MAX_PATH];
    
    			strcpy(Pfad, Path);
    			Pfad[Size - 1] = 0;
    			strcat(Pfad, FD.cFileName);
    			strcat(Pfad, "\\*");
    
    			FolderCount++;
    			PathAnalyse(Pfad);
    			delete(Pfad);
    		}
    		else
    		{
    			FileCount++;
    			/*
    			Element *Data = new Element("Hallo Welt", "Hallo Welt");
    			Liste->Insert(Data);	
    			*/
    		}
    	}while(FindNextFile(hFind, &FD));
    }

    Wenn ich den C:\\ Pfad und alle Unterordner untersuche belegt die obige Funktion stück für Stück meinen Arbeitsspeicher. Obwohl ich das Einfügen der Pfade in meine Liste herausgenommen hab werden trotzdem etwa 500 MB Arbeitsspeicher von der obigen Funktion beansprucht und nachdem die Pfadsuche beendet ist nicht wieder frei gegeben. Da steig ich nicht ganz hinter und finde auch keine Lösung für dieses Problem. Könntet ihr mir bitte weiterhelfen?

    Dienstag, 19. März 2013 17:34

Antworten

Alle Antworten

  • Hallo

    ein new[] braucht ein delete[], also bei dir jetzt

    delete[] Pfad;

    Rudolf

    • Als Antwort vorgeschlagen Bordon Dienstag, 19. März 2013 18:55
    • Als Antwort markiert Ionut DumaModerator Dienstag, 26. März 2013 09:55
    Dienstag, 19. März 2013 18:13
  • Hey Danke für deine schnelle Antwort. Das mit dem delete [] hab ich noch schnell reingebaut und nen Freund hat mich noch drauf hingewiesen, dass ich

    FindClose(hFind);

    aufrufen muss. Danach ging einiges um vieles Leichter und das mit dem delete geht jetzt auch wesentlich schneller

    Dienstag, 19. März 2013 19:35
  • Ich verstehe nicht, was in diesem Fall der Unterschied zwischen delete und delete[] sein soll.

    #include "stdafx.h"
    #include <crtdbg.h>
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	
    	int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); // Get current flag
        flag |= _CRTDBG_LEAK_CHECK_DF; // Turn on leak-checking bit
        _CrtSetDbgFlag(flag); // Set flag to the new value
      
        char *s = new char[30]; 
        //delete s; 
        delete []s; 
      
    
    	
    	return 0;
    }

    • Bearbeitet milonass Dienstag, 19. März 2013 22:37
    Dienstag, 19. März 2013 22:24
  • Für solange es Objekte ohne Destruktor sind ist das auch kein Unterschied. Jedenfalls bei einem VS Compiler.

    Wenn aber hier Objekte mit Destruktor verwendet werden, dann würde nur für das erste Element der Destruktor aufgerufen. Nicht für alle im Array!

    Es ist also ein gewaltiger Unterschied und man sollte es sich angewöhnen "richtig" zu machen.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 20. März 2013 07:07
    Moderator
  • Natürlich ist das ein gewaltiger Unterschied im allgemeinen. In diesem Fall aber gar nicht. Daher ist auch die Aussage, dass der Speicherverbrauch daran liege, dass statt "delete[]" nur "delete" aufgerufen wurde, nicht korrekt.

    Mittwoch, 20. März 2013 13:54