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 :

[WINDOWS] Comment supprimer un pointeur déplacé?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut [WINDOWS] Comment supprimer un pointeur déplacé?
    Bonjour à tous,

    Dans l'une de mes méthodes, je recherche la valeur d'un champ d'une clé de registre Windows à l'aide de la fonction RegQueryValueExA (surchage de la fonction RegQueryValueEx).
    J'appelle cette fonction deux fois, une première fois pour récupérer la taille du buffer, et une deuxième fois pour remplir ma variable (regValue).

    Le problème que je rencontre, c'est que cette fonction Windows stocke les valeurs demandées en les séparant par un caractère de fin de chaine (\0). Du coup, pour récupérer toutes les valeurs, je fait comme ceci:
    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
    // Read the REG_MULTI_SZ values - Get size of the buffer for the values
    returnStatus = RegQueryValueExA(hKey, "NomChamp", NULL, NULL, NULL, &dwSize);
    if(returnStatus != ERROR_SUCCESS)
    {
    	printf("Error reading the registry key");
    	exit(1);
    }
     
    try { regValue = new char[dwSize+1]; }
    catch(bad_alloc &ba) { printf("bad_alloc caught: %s\n", ba.what()); exit(EXIT_FAILURE); }
     
    // Get the values
    returnStatus = RegQueryValueExA(hKey, "NomChamp", NULL, NULL, (LPBYTE)regValue, &dwSize);
    if(returnStatus != ERROR_SUCCESS)
    {
    	printf("Error getting the values of the registry key");
    	exit(3);
    }
     
    // Put the values into the returnValues vector
    for(; *regValue != '\0'; regValue += strlen(regValue)+1)
    {
    	char* itemValue = NULL;
    	try { itemValue = new char[strlen(regValue)+1]; }
    	catch(bad_alloc &ba) { printf("bad_alloc caught: %s\n", ba.what()); exit(EXIT_FAILURE); }
    	strcpy(itemValue, regValue);
    	returnValues.push_back(itemValue);
    }
     
    if(hKey) RegCloseKey(hKey);
    if(regValue) delete[] regValue; // SEGFAULT précisément ici.
     
    return returnValues;
    Etant donné que je modifie l'emplacement du pointeur regValue pour parcourir son contenu, il pointe sur un emplacement vide après la boucle (mais pas égal à NULL).
    Du coup, lorsque j'essaye de le delete, je me retrouve avec une segfault.

    Mais il y a bien une fuite de mémoire, donc comment je peux supprimer ce pointeur?

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour, ce qu'il faut libérer ce n'est pas le pointeur mais l'espace mémoire allouée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char * ptr = new char[500];
    char * ptrIni = ptr;
    //modification de ptr
    delete [] ptrIni;

  3. #3
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Hum d'accord, mais dans mon cas, je ne vois pas quoi libérer alors, étant donné que je ne passe pas le pointeur à un autre pointeur.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Citation Envoyé par CleeM Voir le message
    Hum d'accord, mais dans mon cas, je ne vois pas quoi libérer alors, étant donné que je ne passe pas le pointeur à un autre pointeur.
    Et bien utilise un 2° pointeur, afin d'un conserver un vers l'original et qui servira à la suppression ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre régulier
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 204
    Points : 89
    Points
    89
    Par défaut
    Hum ouai c'était tout simple en fait... Bin merci à vous deux

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/11/2013, 13h56
  2. comment supprimer le item_menu "window"
    Par patricia_kouassi dans le forum Forms
    Réponses: 6
    Dernier message: 20/09/2007, 15h30
  3. comment supprimer windows.OLD
    Par didiouz dans le forum Windows Vista
    Réponses: 5
    Dernier message: 13/04/2007, 12h29
  4. Comment supprimer Windows.old
    Par Trap D dans le forum Windows Vista
    Réponses: 6
    Dernier message: 15/01/2007, 21h46
  5. Réponses: 2
    Dernier message: 11/10/2006, 11h21

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