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 :

r�f�rence sur variable locale


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �prouv�
    Inscrit en
    Novembre 2006
    Messages
    1 073
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par d�faut r�f�rence sur variable locale
    Bonjour

    je voudrais savoir si c'est dangereux de faire un delete sur un pointeur assign� � NULL?
    Comme dans le cas pr�sent o� on fait un delete sur un pointeur dans un destructeur.

    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
    class B{
    	B(){};
    	B(int o):a(o){};
    private:
    	int a;
    };
     
    class A{
    public:
    	A(int o):l(o){
    		n=0;
    	}
    	~A(){
    		delete n;
    	}
    private:
    	B *n;
    	int l;
    };
     
    int main()
    {
     
    	{
    		A a(4);
    	}
    En revanche, y a t il un risque si on fait ceci:


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    class A{
    public:
    	A(int o):l(o){
    		n=0;
    	}
    	~A(){
    		delete n;
    	}
    merci

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    D�tails du profil
    Informations personnelles :
    �ge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par d�faut
    Non �a ne fait rien.

  3. #3
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Pour �tre un peu plus complet: NULL est la seule adresse (en attendant null_ptr de la prochaine norme) connue pour �tre invalide.

    Delete "sait" donc qu'il n'a rien � faire sur cette adresse

    Il faut cependant faire attention aux indirections qui se rajoutent:

    Tu devra obligatoirement tester l'adresse affect�e � ton pointeur si tu essaye de d�sallouer la m�moire d'un membre de celui-ci:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    A::~A()
    {
        delete ptr->membre1;
    }
    posera effectivement probl�me si ptr vaut NULL et devra donc prendre la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    A::~A()
    {
        if(ptr)
            delete ptr->membre1;
        /* pour faire bonne mesure :D */
        delete ptr;
    }
    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

  4. #4
    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
    Non, mais la meilleur solution consiste encore � encapsuler ton pointeur dans une classe qui s'en occupe sp�cifiquement ... un pointeur intelligent quoi !

  5. #5
    Membre �prouv�
    Inscrit en
    Novembre 2006
    Messages
    1 073
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par d�faut
    Non, mais la meilleur solution consiste encore � encapsuler ton pointeur dans une classe qui s'en occupe sp�cifiquement ... un pointeur intelligent quoi !
    Avant de vouloir utiliser des shared pointeur,il faut je pense savoir parfaitement manipuler les pointeurs normaux

  6. #6
    Membre �prouv�
    Inscrit en
    Novembre 2006
    Messages
    1 073
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par d�faut
    j'ai une autre question, c'est sur le renvoie par r�f�rence d'une variable locale. Je le vois souvent.
    Et il me semble que c'est une tr�s grosse erreur, car comportement ind�fini.
    Par exemple:

    int& f(){
    int a=3;
    return a;
    }

    En effet, il se trouve que l'objet a va �tre d�truit, et donc la r�f�rence va �tre un alias d'un objet qui n'existe plus.

    En fait ca ne pose pas de pb pour des build in types, mais pour des objets plus complexes, qui ont entre autre de la m�moire allou�e dynamiquement, ca peut poser probl�me. En fait, il faut �viter a tout pris de renvoyer des build in types, sauf pour l'op�rateur = ou il faut renvoyer une r�f�rence sur this.
    Vous �tes ok?

Discussions similaires

  1. Erreur sur variables locales
    Par dergeekpanda dans le forum Administration syst�me
    R�ponses: 1
    Dernier message: 16/07/2014, 12h27
  2. [VI-2003] R�f�rence hors page sur fichier local
    Par le_sayan dans le forum Visio
    R�ponses: 0
    Dernier message: 09/06/2011, 09h41
  3. R�ponses: 6
    Dernier message: 23/03/2010, 13h01
  4. Filtre sur variable locale en version 5.1.9
    Par souris56 dans le forum Deski
    R�ponses: 8
    Dernier message: 13/04/2007, 18h01
  5. Probl�me variable locale sur MATLAB
    Par nuans dans le forum MATLAB
    R�ponses: 10
    Dernier message: 12/04/2007, 10h34

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