Erreur mémoire

Résolu
Signaler
Messages postés
23
Date d'inscription
lundi 5 novembre 2007
Statut
Membre
Dernière intervention
3 juin 2010
-
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
-
Bonjour,

Je suis face à un problème de mémoire je pense. En effet, je cherche à écrire une fonction qui liste les dossiers d'un répertoire. J'ai fait 3 fonctions, dont les algos sont bons (testés) mais je ne peux jamais récupérer la liste dans mon programme principal. Voici la première que j'ai faite (elle prend en paramètre une chaine de type AWR_String nommée Shd_Folder_Path et renvoie une liste de type AWR_Shd_ShaderList) :

    char* Path;
    Path = StringToChar (Shd_Folder_Path); // We need to manipulate char* variables so we change Shd_Folder_Path into a char*
    strcat(Path,"\\*"); // To go in the Shaders folder
    bool bRestart=false;

Restart:

    WIN32_FIND_DATA wData;
    HANDLE listing;
    listing=FindFirstFile(Path,&wData);
    AWR_Shd_ShaderList Temp_Folders_List;
    if (listing==INVALID_HANDLE_VALUE)
        return Temp_Folders_List;
   
    int bList=true;

    while(bList) // While there is Folder in the Folder Path
    {
        if(wData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) // Check if the it's a Folder
        {
            if(strcmp(wData.cFileName,".")!=0 && strcmp(wData.cFileName,"..")!=0 && !bRestart)
            {
                // We add the Folder to the List of Folders
                AWR_Shd_ShaderBase* New_Folder = new AWR_Shd_ShaderBase (CharToString(wData.cFileName));
                Temp_Folders_List.Add_Shader(New_Folder);
            }
        }
        bList=FindNextFile(listing,&wData); // We go to the next File of the Directory Path
    }
    FindClose(listing);
    if(!bRestart)
    {       
        bRestart=true;
        goto Restart;   
    }
    return Temp_Folders_List;

Tout se passe bien avant le "
if(!bRestart)" qui retourne au Restart et recrée la liste, donc écrase l'ancienne. Quand il arrive au return, il me renvoie donc la deuxième liste, qui est vide. Le truc, c'est que quand je cherche à déplacer le return ou même la déclaration de la liste, mon programme plante sur une erreur de mémoire, un truc genre 0x00005. Là je ne sais plus quoi faire. Je vous mets dessous la déclaration de Add_Shader
car c'est elle qui fait planter dans mes autres fonctions :

void AWR_Shd_ShaderList::Add_Shader (AWR_Shd_ShaderBase * Shader_Base)
{
    this->Current_Shader_List = this->First_Shader_List;
    if (Current_Shader_List == NULL)
    {   
        this->Current_Shader_List = Shader_Base;
        this->First_Shader_List = Shader_Base;
    }
    else
    {
        while (Current_Shader_List->AWR_Next_Shader != NULL)
        {   
            this->Current_Shader_List = this->Current_Shader_List->AWR_Next_Shader;
        }
        this->Current_Shader_List->AWR_Next_Shader = Shader_Base;
    }
}

Merci de m'aider, peu importe les changements que je fais, ça plante le programme ! A L'AIDE !!

1 réponse

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
C'est toi qui a codé la classe AWR_Shd_ShaderList? Et dans ce cas, as-tu implémenté un constructeur de copie?
Parce que quand tu fais return Temp_Folders_List, la variable Temp_... est détruite (puisque déclarée dans la fonction) et une copie est faite dans le code d'où tu as appelé la fonction. Si tu n'a pas implémenté de constructeur de copie, le compilateur en mettra un par défaut, mais il va pas marcher super : il se contente de recopier les données...sauf que toi dans ces données tu avais des pointeurs, donc ceux-ci ne sont plus valides après retour de la fonction et destruction de Temp_...(je suppose que tu libères la mémoire dans le destructeur), par conséquent bug quand tu tentes d'accéder aux données.