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 :

Access violation sur un new


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut Access violation sur un new
    Bonjour à tous,

    J'ai un problème lorsque je tente d'allouer une variable avec l'opérateur "new" ; le message d'erreur suivant apparaît :
    "Project "C:\...\....exe faulted with message : 'access violation at 0x... : write of adress 0x...' Process stoped. Use Step or Run to continue."

    Voici le morceau de code où l'erreur intervient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    type_enr *TabEnr = 0;
    TabEnr = new type_enr[tabCartes[numCarte].NbChamps];
    A l'instant où l'erreur intervient, la variable "tabCartes[numCarte].NbChamps" contient une valeur censée (105).

    En espérant que vous pourrez m'aider, car je dois dire que je ne vois absolument pas d'où cela vient. C'est la première fois que j'ai une telle erreur sur un "new". Pourtant j'en ai fait des allocations mémoires...

    Cordialement !

  2. #2
    Membre expérimenté
    Avatar de bakaneko
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 268
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 268
    Points : 1 427
    Points
    1 427
    Par défaut
    Essayes de passer par une variable pour la taille de ton tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type_enr *TabEnr = 0;
    int taille_tab = tabCartes[numCarte].NbChamps;
    TabEnr = new type_enr[taille_tab];
    Je ne sais pas si cela va solutionner les choses mais à première vue, c'est le seul truc qui pourrait gêner...
    + + +

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Merci pour ta réponse bakaneko, mais cela n'a pas résolu mon problème... Même en remplaçant directement la dimension de mon tableau par une valeur constante (ici 105), j'ai toujours cette erreur...

    Je précise aussi que type_enr est une structure définit comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct type_enr
    {
    	char nom[20];
    	char valx[15];
    	char valy[15];
    	char numile[3];
    	char type[2];
    	char gr1[5];
    	char gr2[5];
    	char gr3[5];
    	char attribut[40];
    };
    Tout ce qui a de plus banal...

  4. #4
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour,

    essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type_enr *TabEnr = new type_enr[105];
    bon courage ...
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  5. #5
    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
    bonsoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    type_enr *TabEnr = 0;
    cette expression n'est pas correcte car l'adresse du ptr est égale à 0 et non pas son contenu
    l'expression correcte est la suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    type_enr *TabEnr = NULL;
    TabEnr = new type_enr[tabCartes[numCarte].NbChamps];
    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

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Merci à tous pour vos réponses,

    Malheureusement, cela n'a toujours pas réglé mon problème... Je dois dire que je suis complètement perdu...

    Si quelqu'un a une idée je suis preneur !!

    Cordialement.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Personne pour me proposer une solution ?

  8. #8
    Membre chevronné
    Avatar de kmaniche
    Inscrit en
    Janvier 2006
    Messages
    1 717
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 717
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonsoir,

    Il va faloir donner plus de code de ton app, du moins le nécessaire pour voir mieux.
    Les règles Les cours La fonction rechercher

    N'oubliez pas de mettre en et de voter.

    La terre n'est pas un héritage de nos parents, mais un emprunt que nous faisons à nos enfants. La protection de notre environnement est la responsabilité de tous. Ne reculez plus devant l'urgence, agissez !

  9. #9
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Quand je fais un programme en C++ j'utilise toujours des classes au lieu de structure. Donc type_enr devrais peut-être être une classe. C'est juste plus constant.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Essaye une exécution avec Codeguard.
    Mais vu l'erreur fait un debug avec un point d'arrêt, met un point suivi sur la variable donnant la taille de ton tableau et met nous une capture d'écran stp.
    Neilos

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Bonjour à tous, et merci pour votre suivi.

    Je vais expliquer un peu plus en détail de quoi il s'agit.
    J'ai crée un composant qui me permet d'afficher une carte. Les fichiers "cartographiques" sont stockés dans un fichier dbf dont la strcuture correspond à celui de mon "struct type_enr". Dans la fonction où se produit l'erreur, je charge en mémoire le contenu de ce fichier. En fait, cette fonction est appelée plusieurs fois afin de charger plusieurs fichiers cartographiques, pour avoir un effet de couche lorsque je les dessine. Lors du premier passage, tout se passe bien, je n'ai aucune erreur. Par contre lors du deuxième passage, j'ai cette fameuse erreur qui intervient sur le "new"...

    Donc voilà un morceau du code de cette 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
     
    bool TComposantZoneSelect::Load(int numCarte)
    {
    	char szNom[20];
    	int i, j;
    	int NumZone;
     
    	// affichage de la carte
    	// chargement du fichier dbf
    	// on ne charge que la premiere région
    	char szSecteurs[800];
    	strcpy(szSecteurs, tabCartes[numCarte].m_szPath);
     
    	tabCartes[numCarte].NbChamps = NbEnrDbf(szSecteurs);
            tabCartes[numCarte].NbZones = 0;
     
    	if(tabCartes[numCarte].NbChamps<=0)
        	    return false;
     
            bINIT = false;
     
    	// chargement des coordonnées par zone et
    	// récupération du Max
    	tabCartes[numCarte].MaxX = 0;
    	tabCartes[numCarte].MaxY = 0;
     
    	type_enr *TabEnr = NULL;
    	TabEnr = new type_enr[tabCartes[numCarte].NbChamps];
    	if(TabEnr == NULL)
    	{
    		MessageBox(NULL,"Erreur d'allocation mémoire (2)", "BD_CARTE", NULL);
    		return false;
    	}
     
            // Traitements
            .........
            delete[] TabEnr;
    Je suis actuellement en train de debugger avec CodeGuard, j'ajouterai les résultats dès que j'aurai fini.

    Merci encore !!

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Avec CodeGuard je n'ai pas d'erreur se rapportant au module cartographique, donc je pense que de ce coté là, il n'y a pas de soucis.

    Je vous met une capture d'écran de la ligne qui pose problème avec la valeur de la taille du tableau.

    Nom : debug.jpg
Affichages : 54
Taille : 94,7 Ko

  13. #13
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Ce serait bien d'utiliser class et non struct.
    Peut-être que cela pourrait même simplifier le code en aval, en ajoutant par exemple quelques méthodes membres... C'est à toi de voir, selon que...

    Par ailleurs, pour ce qui est du ressort du problème, je pense que tu peux faire le raccourci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    class jTypeEnr{...};
    int nbEnr;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    jTypeEnr *TypeEnr = new jTypeEnr[nbEnr]; //renvoie NULL si l'instanciation échoue
    if(TypeEnr == NULL)
        {
        ShowMessage("Maman bobo"); return;
        } 
    //la suite...
    Normalement il ne devrait pas y avoir de problème (pas chez moi en tout cas, avec BCB3 Pro).

    A première vue, c'est quand même étonnant tout ça !

    A plus !

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Bonjour à tous !

    J'ai pris en considération chacune de vos remarques, mais malheureusement aucune ne semble fonctionner chez moi...
    J'ai testé la solution qui consistait à modifier ma structure par une classe. En ayant pris soin de tout modifier, le programme plantait toujours au même endroit... Je suis donc repassé sur mon struct.

    Cepedant, j'ai remarqué que si j'alloue mon tableau avec une dimension assez grande, de l'ordre de 100 000 (cela n'est pas abérant puisque certains de mes fichiers cartographiques font plus de 90 000 lignes), il ne plante pas sur le new qui alloue mon tableau "TabEnr", mais sur une autre allocation effectuée avec un new que je fais plus tard dans une autre fonction pour justement charger les lignes de mon fichier dans "TabEnr".

    Je commence à vraiment desespérer... Merci pour votre aide !

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Si ton programme à des comportements aussi "anormaux" et "irréguliers" c'est en général pour une ou plusieurs raison :

    1. utilises tu des fonctions hors classes ?
    2. utilises tu des variables globales ?
    3. cherche les endroit où tu pourrais dépasser certains buffer et donc écrire n'importe où (via Codeguard) ?
    4. utilises tu la RTL ?
    Neilos

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    Merci Neilos, pour la rapidité avec laquelle tu as répondu !

    utilises tu des fonctions hors classes ?
    Oui, j'en utilise. C'est le cas notamment pour les fonctions permettant de charger les fichiers cartographiques.

    utilises tu des variables globales ?
    Effectivement, j'en utilise aussi. J'ai en autre une variable TList que j'initialise au début de mon programme.

    cherche les endroit où tu pourrais dépasser certains buffer et donc écrire n'importe où (via Codeguard) ?
    Avec CodeGuard, j'ai des erreurs lorsque je quitte mon programme. Ce sont des erreurs "Resource leak" liés à l'initialisation de ma variable globale TList.

    utilises tu la RTL ?
    Oui, mon projet utilise la RTL dynamique.

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    J'ai enfin réussi à résoudre mon problème... J'ai juste décoché la case "Use dynamic RTL" dans les options du projet......

    En tous cas je tiens à vous remercier pour votre collaboration et votre aide.

    @++!

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

Discussions similaires

  1. Access violation sur destructeur TFrame avant lancement Main
    Par dibadoubi dans le forum C++Builder
    Réponses: 0
    Dernier message: 08/12/2012, 13h57
  2. Access violation sur une string
    Par Nekkro dans le forum C++
    Réponses: 11
    Dernier message: 23/01/2012, 08h41
  3. Access violation sur dsnap140.bpl
    Par Ben_Le_Cool dans le forum Langage
    Réponses: 4
    Dernier message: 29/07/2011, 20h06
  4. Réponses: 5
    Dernier message: 27/01/2009, 10h58
  5. Access Violation sur un delete
    Par devroot dans le forum C++
    Réponses: 11
    Dernier message: 29/09/2007, 23h22

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