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 :

[pointeur] Tester la validité


Sujet :

C++

  1. #1
    Membre régulier Avatar de Luffy Duck
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 165
    Points : 120
    Points
    120
    Par défaut [pointeur] Tester la validité
    Bonjour à tous

    Voilà mon problème : J'ai dans mon appli une fenêtre avec des onglets, sur lesquels je charge des images. les données sont stockés dans des char *, dont je transmets les valeurs à la fenêtre pour qu'elle les affiche.

    Evidemment, il faut que je désalloue la mémoire, mais quand je vais sur un autre onglet, Windows (enfin les MFC) a déjà désallouer la mémoire pour les photos qui se trouvent sur cet onglet.

    Je teste en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(photo.data)
         delete []photo.data;
    Mais ça ne fonctionne pas. Comment je peux tester ce pointeur pour savoir si l'adresse est toujours valide ou pas ?

    Merci
    "Des Lapins ? Mais on est pressés... ça devrait aller... Tu crois pas ?"

  2. #2
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    salut
    Je teste en faisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(photo.data)
         delete []photo.data;
    Mais ça ne fonctionne pas. Comment je peux tester ce pointeur pour savoir si l'adresse est toujours valide ou pas ?
    peux tu preciser, parce que pour moi ton test est correct

  3. #3
    Membre régulier Avatar de Luffy Duck
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 165
    Points : 120
    Points
    120
    Par défaut
    Ben il me met en debug
    "<Ptr Incorrect>"

    mais il rentre quand même dans le test et essaie le delete.

    Et là il me fait une exception, comme quoi il est pas très content, il a essayé d'accéder à une adresse où il n'a pas le droit d'aller...

    Je viens de tester en Release, là il ferme le programme : "Opération non conforme, blabla..."

    C'est bizarre tout ça quand même !
    "Des Lapins ? Mais on est pressés... ça devrait aller... Tu crois pas ?"

  4. #4
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    Evidemment, il faut que je désalloue la mémoire, mais quand je vais sur un autre onglet, Windows (enfin les MFC) a déjà désallouer la mémoire pour les photos qui se trouvent sur cet onglet.
    C'est à dire?


    (PS: tu devrai peut etre voir sur le forum visual C++ si c 'est un probleme avec les MFC)

  5. #5
    Membre régulier Avatar de Luffy Duck
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 165
    Points : 120
    Points
    120
    Par défaut
    Ben en fait, j'ai une structure qui contient toutes les photos dont j'ai besoin pour mon appli.

    Imaginons que sur l'onglet 1, j'affiche l'image 1, et sur l'onglet 2 la 2.

    Je quitte l'onglet 1 pour aller sur le 2è, j'appelle ma fonction qui désalloue la mémoire (enfin qui est censée le faire) car il faut que je recharge les images (c'est pour une application industrielle, donc en "live", il faut afficher les produits en cours de production).

    Dans ma fonction Release(), il y a le code que j'ai posté tout à l'heure. Or il n'ya que l'image 1 qui a un pointeur incorrect. J'imagine donc qu'une fonction a libérée la mémoire quand je quitte l'onglet pour aller sur l'autre.

    donc soit je ne libère que les images qu'il n'y avait pas sur mon onglet (ce qui ne m'arrange pas du tout), soit je fais un autre test sur le pointeur pour savoir s'il est valide.
    "Des Lapins ? Mais on est pressés... ça devrait aller... Tu crois pas ?"

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Si c'est un probleme de C++, peut-etre qu'il y a un mismatch entre la fonction utilisee pour allouer (new, new[], malloc) et celle utilisee pour liberer (il faudrait delete, delete[], free) et qu'un tel mismatch est detecte par le mode debug.

    Sinon, je ne connais pas assez Windows pour commenter.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  7. #7
    Membre régulier Avatar de Luffy Duck
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 165
    Points : 120
    Points
    120
    Par défaut
    Pour allouer la mémoire, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    photo.data = new char[photo.size];
    il faut donc que je fasse si j'ai bien compris ce que tu m'as dit ?

    Et pourtant c'est bien ce que je fais. en fait c'est comme si les données était parti, mais le pointeur non réinitialisé.

    Il n'ya donc pas de fonctions qui puisse m'assurer que je peux faire un delete sur le pointeur ?
    "Des Lapins ? Mais on est pressés... ça devrait aller... Tu crois pas ?"

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    y at-il une relation quelconque avec: l'accès d'une zone de mémoire des données privées d'une classe ?

  9. #9
    Membre régulier Avatar de Luffy Duck
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 165
    Points : 120
    Points
    120
    Par défaut
    non, je libère la mémoire dans la classe où se trouve ma structure, par la fonction CFicheProduit::Release();

    j'ai essayé de passer la variable en public, mais même résultat.
    "Des Lapins ? Mais on est pressés... ça devrait aller... Tu crois pas ?"

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Luffy Duck
    Pour allouer la mémoire, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    photo.data = new char[photo.size];
    il faut donc que je fasse si j'ai bien compris ce que tu m'as dit ?
    Oui.

    Il n'ya donc pas de fonctions qui puisse m'assurer que je peux faire un delete sur le pointeur ?
    Rien de standard. Il te faut donc comprendre ce qui se passe.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Membre régulier Avatar de Blowih
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 122
    Points : 115
    Points
    115
    Par défaut
    je pense pas que les MFC desalloue de la memoire comme ça, ( ça fait un bon moment que j'y ai plus touché je dis peut etre une betise)
    de memoire, la selection d'un onblet (avec les MFC) declanche un evemement, sur cet evenement tu dois redessiner la zone graphique avec l'image correspondante.
    il me semble que pour dessiner une image, tu passe l'adresse d'un buffersi tu ne modifi pas ce buffer de façon expliqite, je pense pas que les MFC le fasse.

    es tu sur de ne pas modifier ou alterer ton tableau de char, de le realloué, ou de modifier le pointeur?

  12. #12
    Invité
    Invité(e)
    Par défaut Re: [pointeur] Tester la validité
    Plutot qu'un pointeur sur un char*, essaie d'inserer un objet ayant un constructeur et un destructeur, et affiche un message sur stdout dans chacun d'eux. De cette facon tu verra precisement si un delete se fait sans que tu le sache.

    Citation Envoyé par Luffy Duck
    Je teste en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(photo.data)
         delete []photo.data;
    Juste une petite note: Il est inutile (mais surtout redondant) de tester pour un pointeur null avant de faire un delete dessus. Le standard C++ dit bien que delete fait deja cette verification a l'interne.

  13. #13
    Membre régulier Avatar de Luffy Duck
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 165
    Points : 120
    Points
    120
    Par défaut
    pffffffou, sujet résolu

    En effet, c'était moi

    En fait, pour afficher l'image, je passe le char * data, que je cast en BYTE *.
    Evidemment ensuite, je libérais le BYTE *, qui pointais sur data.

    J'ai donc fait à la place un memcpy(). Est-ce que c'est propre de faire appel à cette fonction ?

    En tout cas, désormais, les delete sur data marche nickel.

    Merci à tous
    "Des Lapins ? Mais on est pressés... ça devrait aller... Tu crois pas ?"

  14. #14
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Citation Envoyé par Luffy Duck
    J'ai donc fait à la place un memcpy(). Est-ce que c'est propre de faire appel à cette fonction ?
    Disons que si tu veux employer les équivalent C++ il y a les std::fill() et std::fill_n().
    Fiquet
    - FAQ SDL
    - FAQ C++

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

Discussions similaires

  1. [VB.NET] Comment tester la validité d'une date ?
    Par Zefree dans le forum ASP.NET
    Réponses: 5
    Dernier message: 15/12/2012, 15h49
  2. Tester la validité d'un pointeur
    Par olive_le_malin dans le forum C++
    Réponses: 21
    Dernier message: 24/05/2007, 10h23
  3. Comment tester la validité d'une adresse mail
    Par jmoez dans le forum Oracle
    Réponses: 1
    Dernier message: 19/04/2006, 13h00
  4. Comment tester la validité d'un répertoire?
    Par Gabrielly dans le forum MFC
    Réponses: 5
    Dernier message: 25/02/2005, 11h13
  5. [web] tester la validiter d'une URL
    Par zebiloute dans le forum Web
    Réponses: 4
    Dernier message: 25/11/2002, 16h51

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