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 :

Pourquoi ce code fonctionne ? (this et shared_ptr)


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Pourquoi ce code fonctionne ? (this et shared_ptr)
    Bonsoir,

    Je cherche en vain à essayer de récupérer un pointeur vers le this d’une classe. J’essaye avec la classe enable_shared_from_this mais cela m’oblige à créer un pointeur de l’objet que j’utilise sinon j’ai droit à une erreur. Je pense avoir une solution (voir le code ci-dessus), mais je ne comprends pas le résultat. Pourquoi, mon pointeur intelligent pointe toujours vers l’objet après que celui-ci soit détruit ?

    La classe :
    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
     
    class MyClass
    {
    public:
    	MyClass();
    	~MyClass();
    	void Print();
    	const shared_ptr<MyClass> & Get_pointer();
    private:
    	shared_ptr<MyClass> pointer;
    };
     
    MyClass::MyClass()
    {
    	pointer = shared_ptr<MyClass>(this);
    	cout << "Constructor" << endl;
    }
     
    MyClass::~MyClass()
    {
    	cout << "Destructor" << endl;
    }
     
    void MyClass::Print()
    {
    	std::cout << "Print" << std::endl;
    }
     
    const shared_ptr<MyClass> & MyClass::Get_pointer()
    {
    	return pointer;
    }
    Le bloc d’exécution :
    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
     
    std::shared_ptr<MyClass> gp1;
     
    void Func()
    {
    	MyClass o = MyClass();
    	gp1 = o.Get_pointer();
    	gp1->Print();
    	cout << gp1.use_count() << endl;
    }
     
    int main()
    {
    	Func();
    	gp1->Print();
    	cout << gp1.use_count() << endl;
    }
    La sortie console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Constructor
    Print
    2
    Destructor
    Print (<< Comment est-ce possible ?)
    1      (<< Comment est-ce possible ?)

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ton objet est créé sur la pile (automatic storage) : il est automatiquement et irrémédiablement détruit en fin de portée. Le reste, c'est un comportement indéterminé.

    Pour qu'il survive, tu dois en prendre possession en le créant via new ou std::make_shared. Tu peux interdire à l'utilisateur d'instancier cette classe sur la pile en qualifiant le destructeur private, par exemple.

  3. #3
    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
    Tu veux récupérer le this d'une classe, mais où se trouve ton return this alors ?
    std::enable_shared_from_this ne sert que si ta classe est utilisée comme shared_ptr afin de pouvoir écrire myClass.shared_from_this() afin de récupérer un shared_ptr à partir de l'instance. Cf la documentation.
    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.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2017
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci à vous deux.

    Mon return this c’est ma méthode GetPointer() qui retourne un shared_ptr du this de la classe MyClass ; mais cette manière fonctionne seulement dans une application console, car dès que je fais la même chose dans un projet openFramewok ça ne compile pas.

    D’ailleurs, pourquoi es ton obligé de créer un shared_ptr de l’objet pour pouvoir utiliser la méthode shared_from_this() d’une classe qui hérite de enable_shared_from_this ? Pourquoi avec une simple allocation sur la pile ça ne fonctionne pas ?

Discussions similaires

  1. Réponses: 5
    Dernier message: 17/02/2011, 14h45
  2. [XMLHttpRequest] Pourquoi ce code fonctionne sous IE8 et pas sur Firexox 3.0.11
    Par homeostasie dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 23/07/2009, 14h50
  3. pourquoi mon code ne fonctionne pas
    Par jmlb35 dans le forum VBA Access
    Réponses: 2
    Dernier message: 30/06/2008, 19h02
  4. Réponses: 6
    Dernier message: 11/07/2007, 13h29
  5. Réponses: 6
    Dernier message: 12/04/2007, 13h58

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