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

Langage C++ Discussion :

destructeur appelé n'importe quand


Sujet :

Langage C++

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Par défaut destructeur appelé n'importe quand
    Salut, le code suivant me retourne un handle invalide sur le handle du fichier,
    et le destructeur est appelé juste après l'assignation, avec hFile = le handle de fichier retourné par OpenFileEx dans le constructeur.
    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
     
    class MyFile
    {
    public:
        HANDLE hFile;
        MyFile(std::string filename)
        {
            hFile = CreateFile(filename.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL);
        }
        MyFile()
        {
            hFile = NULL;
        }
        ~MyFile()
        {
            CloseHandle(hFile);
            // Breakpoint ici, il se produit juste après l'assignation et hFile est valide ici.
        }
    };
     
    MyFile fileA;
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        fileA = MyFile("test.txt");
     
        char * buffer = new char[100];
        DWORD BytesRead = 0;
     
        ReadFile(fileA.hFile, buffer, 100, &BytesRead, NULL);
        int a = GetLastError();
        // Breakpoint ici, a = ERROR_INVALID_HANDLE
        delete[] buffer;
        return 0;
    }
    Donc la question est, est ce que mon compilo déc**** a plein tube, ou bien c'est moi qui n'ai rien compris ^^

    Merci d'avance pour toutes les réponses.

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    fileA = MyFile("test.txt");

    tu construit un MyFile temporaire que tu affecte a fileA. Une fois fait, le temporaire est detruit.


    Tout est normal.

  3. #3
    screetch
    Invité(e)
    Par défaut
    regarde "constructeur de copie" et "operateur d'affectation" sur google

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Par défaut
    Okay, je viens de saisir, la copie est bien faite mais l'objet global et celui créé lors de l'assignation partagent le meme handle, comme l'un est détruit, le handle de l'autre devient invalide.
    Quelqu'un aurait une solution pour conserver le handle lors de la destruction d'une copie? Autre que passer par un new/delete ^^

  5. #5
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    il te faut un operateur d'affectation si tu tiens a donner une semantique de valeur a ton objet.

  6. #6
    screetch
    Invité(e)
    Par défaut
    Sinon, éviter la variable globale, interdire la copie avec un opérateur de copie/d'affectation privés, et passer ton objet par référence a ceux qui en ont besoin.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Histoire d'appeler les choses par leur nom : RAII

    F.A.Q. : Le RAII
    Tutoriel : Gérer ses ressources de manière robuste en C++ par Aurélien Regat-Barre

    P.S. ça devrait devenir pavlovien:
    : char * buffer = new char[100];
    std::vector<unsigned char>buffer(100);

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 33
    Par défaut
    réponse un peu lente désolé :S

    la meilleure solution est souvent la plus simple :p
    je pense que pour une classe aussi basique je vais donc rendre privé constructeur de copie et operateur d'assignation. Merci pour les réponses ^^

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

Discussions similaires

  1. Appeler une fonction quand une donnée MySQL change
    Par ApocKalipsS dans le forum Langage
    Réponses: 7
    Dernier message: 28/02/2010, 17h24
  2. Réponses: 2
    Dernier message: 17/11/2009, 09h17
  3. Réponses: 0
    Dernier message: 11/12/2007, 11h42
  4. double appel du script quand balise <img src vide
    Par zamanika dans le forum Langage
    Réponses: 8
    Dernier message: 16/11/2006, 12h21

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