Erreur mémoire

Résolu
Mitch986 Messages postés 23 Date d'inscription lundi 5 novembre 2007 Statut Membre Dernière intervention 3 juin 2010 - 30 nov. 2007 à 10:35
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 - 1 déc. 2007 à 12:06
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

cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
1 déc. 2007 à 12:06
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.
3
Rejoignez-nous