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++Builder Discussion :

Erreur acces mémoire


Sujet :

C++Builder

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Points : 62
    Points
    62
    Par défaut Erreur acces mémoire
    Je suis en train de programmer un petit soft au boulot et je suis tombé sur une erreur étrange que j'arrive pas a comprendre.

    en fait j'ai une classe qui contient en private des pointeurs.
    et quand je passe dans le constructeur, j'initialise ces pointeurs à NULL pour faire correctement mon delete dans le destructeur s'ils sont alloué durant le process.... jusqu'à la rien d'extraordinaire...

    Sauf que quand je place NULL dans ces pointeurs j'ai un autre pointeur qui passe a NULL alors qu'il n'a rien a voir avec ceux-là.

    pour moi un pointeur c'est juste un espace mémoire de 4 octet qui stocke une adresse où, dans ce cas, je place à NULL comme adresse à l'intérieur.

    J'ai l'impression en fait que ces deux pointeurs on la même adresse mémoire... et je trouve ça très étrange.

    Est-ce Borland qui a du mal a gérer la mémoire ???
    Ou c'est tout a fait autre chose qui m'échappe

  2. #2
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    bonjour,

    Pourrais tu mettre un bout de code?
    celui du constructeur, et les déclarations des pointeurs.

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Points : 62
    Points
    62
    Par défaut
    Si ca peut t'aider... mais bon c'est standard...

    dans la declaration de la classe j'ai un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class ClassGen
    {
    private:
     ClassBidon *pClassBidon;
    }
    et dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ClassGen::ClassGen()
    {
    pClassBidon = NULL;
    }
    et en fait quand j'ai une fonction du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void func()
    {
       UneAutreClasse *test= new UneAutreClasse();
       ClassGen ClassAProbleme; // A PARTIR DE LA la variable test est de nouveau à NULL.
       ..... suite du programme.
    }
    je ne suis pas un newbi non plus en C++, quand je dis qu'il y a quelque chose d'étrange on est déjà 8 dans le bureau a savoir coder qui trouvent ça étrange.

  4. #4
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    Je n'ai pas mis en doute tes compétences...
    J'espérais juste avoir une piste ou deux avec un exemple c'est tout!

    En fait, j'ai déjà eu des problèmes similaires... (dépassement de mémoire et autre joyeuseté!)

    Dans ce genre de cas, je rajouterais une variable (généralement un int) juste après le new.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void func()
    {
       UneAutreClasse *test= new UneAutreClasse();
       int Debug = 5;
       ClassGen ClassAProbleme; 
       ..... suite du programme.
    }
    "normalement", si c'est bien un problème de gestion mémoire, sa valeur doit changer, mais plus celle de test. sinon, le problème est peut être plus compliqué que juste la gestion mémoire...

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Points : 62
    Points
    62
    Par défaut
    ouais mais le pire dans mon cas c'est que cela se produit sur le pointeur passé en paramètre a la fonction, (il est initialisé bien avant)...

  6. #6
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 136
    Points : 115
    Points
    115
    Par défaut
    heu??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void func(UneAutreClasse *test)
    {
       int Debug = 5;
       ClassGen ClassAProbleme; 
       ..... suite du programme.
    }
     
    classGen::classGen()
    {
     ptr1 = NULL;
     ptr2 = NULL;
    }
    je suis pas sur d'avoir tout compris en fait...

    dans cette fonction, t'as des variables déclaré avant la création de cette classe?
    est ce que le code écrit ci dessus se rapproche plus de ton problème?

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    l'exemple de code que tu a posté est parfaitement fonctionnel
    je n'ai pas pu reproduire le défaut anoncé
    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
    45
    46
    47
    48
    49
    50
     
    //---------------------------------------------------------------------------
    class Bidon
    {
      public:
       Bidon(){;};
       ~Bidon(){;}
    };
     
     
     
    class ClassGen
    {
      public:
      ClassGen(){pClassBidon = NULL;};
      ~ClassGen(){};
    private:
     Bidon *pClassBidon;
    };
     
     
     
     
    class UneAutreClasse
    {
     public:
       UneAutreClasse(){Entry=NULL;};
       ~UneAutreClasse(){;};
     private:
       char* Entry;
     
    };
     
     
    void func()
    {
       UneAutreClasse *test= NULL;
       test=new UneAutreClasse();
       ClassGen ClassAProbleme; // A PARTIR DE LA la variable test est de nouveau à NULL.
      // ..... suite du programme.
    }
     
     
    #pragma argsused
    int main(int argc, char* argv[])
    {
     
        func();
        return 0;
    }
    Je pense qu'il faut investiger sur d'autre pistes.
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Points : 62
    Points
    62
    Par défaut
    je sais que le code est parfaitement fonctionnel... car il est basique et il n'y a aucune erreur.

    mais il s'avère que dans un contexte bien précis il plante (surement du a C++ Builder et la gestion de la mémoire...), ce que je cherchais a savoir c'est si c'est déjà arrivé a deux trois personnes qui pourrais m'aiguiller ....

    par exemple est-ce possible qu'une dll charger par le programme tape dans la mémoire et fasse que ca plante..

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2006
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 190
    Points : 179
    Points
    179
    Par défaut
    Bonjour,

    As-tu essayé de redémarrer ton ordinateur? Je sais que ça a l'air bête comme ça, mais si, pour x ou y raison, ta mémoire est déjà à la base corrompue, ceci pourrait expliquer cela.

    Autre piste, j'ai cru lire que tu travaillais sur un projet avec plusieurs dll. As-tu relancé une compilation complète (dlls comprises)?
    On ne sait jamais, un décalage dans des structures est si vite arrivé.

    Bon courage,

    Benjamin

  10. #10
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Bonjour
    dans le code exemple que tu a posté tu indique que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UneAutreClasse *test= new UneAutreClasse();
       ClassGen ClassAProbleme; // A PARTIR DE LA la variable test est de nouveau à NULL.
       ..... suite du programme.
    Je n'ai pas constaté ce genre d'erreur sur ma machine qu'en est il chez toi ?
    d'autre part quelle version de C++ builder utilise tu ?

    cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  11. #11
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Points : 62
    Points
    62
    Par défaut
    j'ai pas le code de toutes les dll utilisé, et on travaille sur Builder 5.0
    mon ordinateur a été redémarré et j'ai des petits scripts qui purge ma mémoire entre chaque série de test.... donc de ce point de vue là....
    en plus mes collègue ont aussi l'erreur ....

  12. #12
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    bonjour,
    concernant les DLL
    Sous windows les DLL sont chargées dans des zones distinctes de l'espace mémoire alloué par l'OS à ton application.

    Il ny a donc en principe pas de possibilité de conflict à moins d'un pointeur mal initialisé qui irait dans l'espace mémoire réservé à chaque DLL.

    Sous C++ builder tu peux voir l'espace mémoire de chaque DLL sous la fenêtre Module (CTRL ALT M)

    Si tu pense que c'est une erreur du compilateur va voir via codeCentral si l'erreur est référencée chez codeGear

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2006
    Messages : 166
    Points : 62
    Points
    62
    Par défaut
    Bon apres une journée entière a chercher, on a fini par trouvé, c'etait effectivement une DLL qui appeler la DLL sur laquelle je travaille, mais l'autre DLL n'avais pas la signature de nos fonctions a jour.... en corrigeant les .h non mis à jour tout ce passe maintenant sans aucun problème.

    Je me disais bien que pour avoir une erreur comme ça, ça venais forcement de l'extérieur (une autre DLL qui tapait dans le tas....).

    Donc si vous avez une erreur incompréhensible point de vu programmation, VERIFIEZ LES SIGNATURES DE TOUTES LES FONCTIONS EXPORTEES PAR VOS DLLS !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Try Catch (?) sur une erreur d'accès mémoire
    Par Jflop91 dans le forum Langage
    Réponses: 1
    Dernier message: 26/03/2013, 15h36
  2. Récursivité -- Erreur d'accès mémoire
    Par Monta^^ dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 13/07/2009, 12h46
  3. Programme détectant les erreurs de mémoire
    Par gids01 dans le forum MFC
    Réponses: 2
    Dernier message: 07/12/2005, 10h57
  4. [crash] Erreur accès fichier
    Par cesar33 dans le forum Access
    Réponses: 1
    Dernier message: 21/10/2005, 14h44
  5. Erreur Accès BDD
    Par psyco2604 dans le forum ASP
    Réponses: 13
    Dernier message: 10/06/2004, 10h46

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