delete von strrchr-rückgabewert



  • guten abend allerseits.

    ich versuche alle dateien eines ordners auszulesen, und zu überprüfen, ob die dateiendung .txt ist. ich habe folgenden code:

    DIR *mdir = NULL;
    	mdir = opendir("./Data");
    	if(mdir == NULL)
    		exitProgram("ERROR: ./Data not found!\n");
    
    	dirent *mentry = NULL;
    
    	char *str = new char[32];
    	char *path = new char[45];
    
    	while(mentry = readdir(mdir)) {
    		if(strcmp(mentry->d_name, ".") != 0 && strcmp(mentry->d_name, "..") != 0) {
    			str = strrchr(mentry->d_name, '.');
    			if(strcmp(str, ".txt") == 0) {
    				// liste u.a. dateien auf
    			}
    		}
    	}
    	closedir(mdir);
    	delete(mentry);
    	delete[](str);
    	delete[](path);
    

    die dateien werden korrekt aufgelistet, das problem tritt erst beim befehl delete[](str) auf:

    *** glibc detected *** /.../compiled: free(): invalid pointer: 0x000000000061d246 ***

    kann mir jemand sagen wie ich den speicher, den die variable str belegt wieder freigeben kann? der fehler tritt auf, wenn ich str nach dem aufruf von strrchr freigeben will, vorher kann man die variable ohne probleme deleten



  • char *str = new char[32]; // str zeigt auf den angelegten Speicher
    
    str = strrchr(mentry->d_name, '.'); // str zeigt nun auf ganz anderen Speicher
    
    // Toll, jetzt hast du den Verweis auf den von dir angelegten Speicher verloren
    // Und wie willst du jetzt jemals wieder auf ihn zugreifen?
    
    delete [] str; // Speicher freigeben, den du aber garnicht angelegt hast
    

    MfG



  • achsooo 😃
    dankeschön, error ist weg und valgrind zeigt auch kein memory leak 🙂 (ausser solche, die bei glut- oder alut-funktionen entstehen... 🙄 falls jemand einen tipp bezüglich dieser leaks hat: nur zu 😉 obwohl das nicht hier hingehört)



  • wenn du uns die glut und alut definitionen zeigst, kann dir vielleicht geholfen werden - oder sind das Funktionen aus irgendwelchen Bibliotheken?



  • sind aus blbliotheken.
    verwende ubuntu und hab die libaries aus der paketquelle (libalut, libglut3)


Anmelden zum Antworten