IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

probleme de memoire, comment vider un tableau qui est en retour d'une fonction


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 74
    Points : 48
    Points
    48
    Par défaut probleme de memoire, comment vider un tableau qui est en retour d'une fonction
    Bonjour, j'ai une application c++ qui fonctionne mal, je pense que le probleme vient de la memoire car j'ai une fonction qui remplit un tableau et le renvoit en retour, mais je ne vois pas comment ensuite liberer la memoire car la variable est locale à la fonction.

    voici ma fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    ns__classedetab transATVAL2(ATListe * apTab)
    {
    	ns__classedetab tab;
     
    	tab.tabcoparam.__size = apTab->Count() ;
    	tab.tabcotype.__size = apTab->Count() ;
    	tab.tablibparam.__size = apTab->Count() ;
     
    	tab.tabcoparam.__ptr = new char*[apTab->Count()*sizeof(char*)];
    	tab.tabcotype.__ptr = new char*[apTab->Count()*sizeof(char*)];
    	tab.tablibparam.__ptr = new char*[apTab->Count()*sizeof(char*)];
     
     
    long LigTab;// ligne du tableau
     
    for (LigTab = 0 ; LigTab < apTab->Count() ; LigTab ++ )
    {
     	//on recupere la 1ere colonne du tableau
     	AF_char * ltabligne1 = apTab->gString(LigTab,0);
     
     	//on recupere la 2ieme colonne du tableau
     	AF_char * ltabligne2 = apTab->gString(LigTab,1);
     
    	//on recupere la 3ieme colonne du tableau
     	AF_char * ltabligne3 = apTab->gString(LigTab,2);
     
     	//recopie des noms de fonctions contenues dans la 1ere ligne
     	char * nomfonc = (char *) ltabligne1 ;
     	//recopie les cotype des parametres contenus dans la 2ieme ligne
    	char * cotype = (char *) ltabligne2 ;
    	//recopie les libelles des parametres contenus dans la 3ieme ligne
    	char * lib = (char *) ltabligne3 ;
     
         tab.tabcoparam.__ptr[LigTab] = new char[20];
         strcpy(tab.tabcoparam.__ptr[LigTab],  nomfonc );
     
         tab.tabcotype.__ptr[LigTab] = new char[20];
         strcpy(tab.tabcotype.__ptr[LigTab],  cotype );
     
         tab.tablibparam.__ptr[LigTab] = new char[20];
         strcpy(tab.tablibparam.__ptr[LigTab],  lib );
      }
    return tab;
    }
    le code est un peu particulier car c'est pour le faire communiquer avec une page web, mais sur le principe des allocations c'est pareil.
    quelqu'un pourrait-il m'aider?
    Si je ne suis pas assez claire dite le moi. Merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Points : 74
    Points
    74
    Par défaut
    tu devrais utiliser [CODE*][/CODE*] ca serait plus lisible.

    Pourquoi pas creer l'objet dynamiquement, et renvoyer le pointeur ?

    D'ailleurs si ns__classedetab est une classe, un constructeur adapté pourrait s'occupé de toutes les allocations.
    Genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ns__classedetab *transATVAL2(ATListe * apTab)
    {
        ns__classedetab *tab=new ns__classedetab(apTab->Count() );
     
        ...
        return tab
    }
    et tu surcharge ton constructeur de ns__classedetab:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    ns__classedetab::ns__classedetab(long count)
    {
        this->tabcoparam.__size = count;
        this->tabcotype.__size = count;
        this->tablibparam.__size = count;
     
        this->tabcoparam.__ptr = new char*[count*sizeof(char*)];
        this->tabcotype.__ptr = new char*[count*sizeof(char*)];
        this->tablibparam.__ptr = new char*[count*sizeof(char*)];
    }
    Et tu fais le destructeur adapté pour librere toute la memoire.

  3. #3
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 74
    Points : 48
    Points
    48
    Par défaut
    ok, et quand est ce que j'appelle le destructeur? apres l'appel de la fonction?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Points : 74
    Points
    74
    Par défaut
    Ben tu detruis ton objet quand tu en a plus l'utilité.

    C'est une solution possible, mais y'en a d'autre.

  5. #5
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Le mieux est peut être de gérer l'allocation en dehors de la fonction :
    tu alloues ton tableau, passe le pointeur à la fonction, et tu le désalloues quand tu n'en n'a plus besoin.
    Tu peux aussi vérifier dans la fonction si le tableau passé en paramètre est NULL. Dans ce cas soit tu renvoie un code d'erreur soit tu le créé en interne dans ta fonction.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 59
    Points : 74
    Points
    74
    Par défaut
    Oui je pense aussi que c'est mieux de le passer en parametre, plutot que alloué la memoire dans une fonction et la supprimer ailleurs.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    l objet que tu retourne est une copie de ton objet local a la fonction "ns__classedetab tab". Cette remarque conduit aux questions suivantes:

    - existe t il un constructeur pour la classe ns__classedetab ?

    - l operateur de recopie est il definie ?

    - existe il un destructeur ? si oui , est ce qu il ne detruirait pas par hazard les pointeurs qu'il contient ?

    note: l idee de faire un constructeur pour ns__classedetab est plutot bonne, mais une bonne regle de programmation est que :

    si un objet a besoin de constructeur / destructeur / operateur de copie il a besoin des 3.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    Citation Envoyé par tetedeturcq
    ok, et quand est ce que j'appelle le destructeur? apres l'appel de la fonction?
    le destructeur d un objet est appele implicitement :

    - soit a la sortie du bloc auquel il appartient (une fonction est un bloc) s il est alloue sur la pile (c est le cas de ton objet)

    - soit quand tu appelles delete si il est alloue dans le tas

  9. #9
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Utilise std::string et std::vector.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/05/2012, 15h42
  2. Réponses: 1
    Dernier message: 13/05/2010, 17h13
  3. Comment vider un tableau
    Par xavpiaf dans le forum Flex
    Réponses: 3
    Dernier message: 02/04/2009, 20h10
  4. Réponses: 5
    Dernier message: 29/09/2006, 18h17
  5. Comment vider un tableau de char ?
    Par Battosaiii dans le forum C
    Réponses: 5
    Dernier message: 18/03/2006, 18h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo