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 :

C++: Violation d'accès à la lecture


Sujet :

C++

  1. #21
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par seb68270 Voir le message
    Vous éveillez ma curiosité là ! Qu'est-ce que ça apporterait de plus que je mette la variable en const ?
    Citation Envoyé par Bousk Voir le message
    Ca parait anodin, mais c'est le pacte, le contrat, que remplit ma fonction.

    A l'inverse, si l'argument n'est pas const, je n'ai absolument aucune assurance qu'il ne sera pas modifié.

    Dans le cadre d'un TP de cours qui fait 2 méthodes et 15 lignes c'est sur que ça parait stupide.
    Quand on parle d'une appli de plusieurs années et millions de lignes...
    En gros ça plante !!! Et c'est mieux que d'avoir un bug presque introuvable à 3 jours d'une livraison (parce que le programme ne commence à planter que 3 jours avant la livraison )...

  2. #22
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    En fait, le passage d'un argument sous une forme constante permet de dire "attention, on ne peut absolument pas aller modifier l'état de cet argument". C'est ce que l'on appelle "imposer un invariant".

    Ca, c'est quelque chose que le compilateur est en mesure de comprendre, et qu'il est en mesure de faire respecter. Comment En s'assurant que toutes les fonctions qui utiliseront l'argument ne sera pas modifié.

    C'est à dire qu'il pourra vérifier que tu n'essaye pas de transmettre l'argument à une fonction qui le prendrait sous la forme d'une référence non constante (car les modifications seraient reportées à ton argument) et que tu n'appelle que des fonctions qui se sont engagées à ne pas modifier l'état de ton argument (les fonctions membres déclarées constantes).

    Car, si tu essayes de transmettre un argument constant à une fonction qui prend la forme non constante, le compilateur se plaindra qu'il ne peux pas convertir un const TonType & en un TonType et que, pour les fonctions membres qui ne sont pas déclarées constantes, il se plaindra que tu utilises un "this constant". Quoi qu'il en soit, le compilateur refusera automatiquement que tu utilises ton argument constant avec n'importe quelle fonction pour laquelle "il y a risque qu'il soit modifié". Avec une telle garantie, tu t'assures que les seules modifications qui surviennent à tes différents objets sont des modifications qui ont été clairement voulues (ou, à tout le moins qui surviennent dans un contexte dans lequel la modification de ton objet a bel et bien été envisagée) .

    Et comme le compilateur sera toujours plus têtu que toi, tu feras en sorte de le satisfaire, si tu veux que ton programme compile
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #23
    Membre confirmé
    Profil pro
    Consultant en technologies
    Inscrit en
    Octobre 2013
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies

    Informations forums :
    Inscription : Octobre 2013
    Messages : 158
    Points : 555
    Points
    555
    Par défaut
    Deux remarques/questions sur ce sujets

    * Je crois que const n'est pas une garantie suffisante que l'objet ne soit en aucun cas modifié (soit par le biais d'un const_cast, soit par un débordement de pointeurs) bon, le premier cas devrait être rare et controlé, le second est généralement le signe d'un programme qui a un comportement non déterministe. est

    * J'ai toujours crus, que const était aussi un indice donné au compilateur pour faire des optimisations (car il sait que telle variable ne sera pas modifié), or personne n'en parle ici. qu'en est il en vrai. ?

  4. #24
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par _zzyx_ Voir le message
    Deux remarques/questions sur ce sujets

    * Je crois que const n'est pas une garantie suffisante que l'objet ne soit en aucun cas modifié (soit par le biais d'un const_cast, soit par un débordement de pointeurs) bon, le premier cas devrait être rare et controlé, le second est généralement le signe d'un programme qui a un comportement non déterministe. est
    Il est clair que le mot clé const ne peut donner une garantie que sur ce qui est "correctement" codé/programmé.

    Si le développeur fait une connerie et tente d'accéder à une adresse mémoire à laquelle il n'aurait jamais du tenter d'accéder, ll est évident que rien ni personne ne pourra le sauver. Le seul moyen pour résoudre le problème passera par une longue et fastidieuse séance de débogage .

    Le langage et le compilateur sont des alliés de choix quand il s'agit d'appliquer une logique correcte, mais ne peuvent effectivement rien pour nous si l'on fait des conneries de conception
    * J'ai toujours crus, que const était aussi un indice donné au compilateur pour faire des optimisations (car il sait que telle variable ne sera pas modifié), or personne n'en parle ici. qu'en est il en vrai. ?
    Oui, c'est tout à fait vrai.

    Il est, par exemple, tout à fait en mesure d'évaluer des expressions mathématiques simples ( A =(X+Y)*Z, par exemple) et définir directement le résultat de l'expression comme valeur pour A si A, X, Y et Z sont constants.

    Ainsi, si X vaut 2, Y vaut 3 et Z vaut 4, la valeur de A sera directement définie "en dur" à 20 car cela correspond bel et bien au résultat de l'expression indiquée. Notes d'ailleurs que ce n'est qu'un des exemples les plus simples d'optimisation dont le compilateur est capable

    Ceci dit, si on n'a pas parlé de cet avantage, c'est "simplement" parce que l'intérêt de la chose n'est pas primordial lorsqu'il s'agit d'expliquer simplement le bénéfice que l'on retire à respecter la const-correctness. C'est la "cerise sur le gâteau"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #25
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Il est, par exemple, tout à fait en mesure d'évaluer des expressions mathématiques simples ( A =(X+Y)*Z, par exemple) et définir directement le résultat de l'expression comme valeur pour A si A, X, Y et Z sont constants.
    C’est plus ou moins vrai, en fait. De nos jours, les compilateurs n’utilisent plus l’indication const pour leurs optimisations, mais déterminent eux-même si la valeur change (comme il faut le faire de toute manière à cause de const_cast, autant l’appliquer à toutes les variables).

    En revanche, c++11 a introduit constexpr, qui lui te garantit que l’expression sera évaluée (et donc, optimisée) à la compilation.

Discussions similaires

  1. Violation d'accès en lecture écriture
    Par 3Fred9 dans le forum Langage
    Réponses: 5
    Dernier message: 30/03/2010, 14h36
  2. Réponses: 5
    Dernier message: 01/12/2009, 01h06
  3. Réponses: 7
    Dernier message: 13/08/2009, 09h01
  4. Réponses: 5
    Dernier message: 02/01/2009, 10h37
  5. Violation d'accès lors de la lecture
    Par Fullmetal82 dans le forum C++
    Réponses: 9
    Dernier message: 29/11/2007, 17h13

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