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++/CLI Discussion :

Passage d'objet par valeur


Sujet :

C++/CLI

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut Passage d'objet par valeur
    Bonjour,

    Je me trouve devant un épineux problème d'access violation ...

    J'ai une application C#.Net qui doit utiliser une librairie C++ native.
    Je me suis donc attelé à écrire un wrapper C++/cli pour permettre la communication.

    Ma solution VS se compose donc comme suit :
    - un projet C#
    - un projet C++ mixte avec des classes CLI et des classes en natif
    Le projet c++ est lié à la bibliothèque native (mapnik) que je veux wrapper et le projet C# est lié au projet C++.

    A plusieurs endroits de mon code c++ natif, les méthodes prennent des arguments de type std::string.
    Qu'à cela ne tienne, je converti les System::String^ en std String seulement voilà :
    En debug step, by step, dans le constructeur de ma classe native prenant un std::string, si je regarde la valeur de mon paramètre, le texte est correcte.
    Mais juste après, avoir créer mon objet, le C# appelle indirectement une méthode de mon objet fraichement instancié et là, crack ! dans la méthode, la valeur de ma variable d'instance vaut tout sauf la valeur affectée dans le constructeur ...

    J'ai lu ici (sans bien tout comprendre) que ça pourrait venir du fait que les objets seraient déclarés/instanciés dans des dll différentes.

    D'où mon idée de vouloir recréer un nouveau string dans le constructeur de ma classe qui éviterait un pointeur vers une zone mémoire incertaine.
    (Si tant est que j'ai bien identifié le problème)

    Mon niveau de C++ est assez basique et là c'est clairement en dehors de mon domaine de compréhension

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Peux-tu poster un code minimal reproduisant le problème?

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    Merci d'avoir répondu

    Naturellement, loi de Murphy oblige, c'est quand on veut recréer l'erreur qu'on n'y arrive pas ...

    A défaut j'ai trouvé mon problème.
    Trop tromatisé par les pointeurs j'en viens à faire des initialisations plus que douteuses.
    j'ai tellement honte (allé, je le poste quand même juste pour vous faire rire un peu)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	WrapperClass::WrapperClass(System::String ^str)
    	{
    		std::string s_str = str_to_str(str);	
    		_mnc = &(MyNativeClass(s_str));
    	}
    du coup, je présume que le problème venait du fait que l'objet pointé était détruit à la fin du constructeur.

    Mais d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _mnc = new MyNativeClass(s_str);
    lève une autre question dans mon esprit novice.
    Sachant que _mnc (variable d'instance) est un pointeur vers un objet natif et que WrapperClass est un objet managé ; faut-il explicitement déclarer un destructeur pour WrapperClass pour delete le pointeur ou bien c'est le langage managé qui s'en chargera pour moi ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Il faut explicitement un destructeur pour MyWrapperClass.

    Ou plus précisément, un destructeur et un finaliseur, le premier appelant le second, et le second faisant le nettoyage:
    http://msdn.microsoft.com/en-us/library/ms177197.aspx

    Code C++/CLI : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //Destructeur managé
    	WrapperClass::~WrapperClass()
    	{
    		this->!WrapperClass();
    	}
     
    	//Finaliseur:
    	//N'utiliser aucune variable membre managée ici
    	WrapperClass::!WrapperClass()
    	{
    		delete _mnc;
    		_mnc = nullptr;
    	}
    Tu peux appeler explicitement le destructeur avec un Dispose() en C# (ta classe implémentant l'interface IDisposable), et si tu ne le fais pas, le finaliseur sera automatiquement appelé quand l'objet sera détruit par le GC.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2006
    Messages : 126
    Points : 93
    Points
    93
    Par défaut
    D'accord

    merci pour ces précisions

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

Discussions similaires

  1. Passage d'objet par valeur
    Par roro06 dans le forum C#
    Réponses: 9
    Dernier message: 14/01/2011, 17h22
  2. Passage des arguments par valeur
    Par mpereg dans le forum Général Python
    Réponses: 4
    Dernier message: 13/03/2007, 17h12
  3. [POO] Objet par valeur
    Par seb34 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 03/08/2006, 22h49
  4. [String] passage d'objet par référence
    Par adilou1981 dans le forum Langage
    Réponses: 8
    Dernier message: 01/04/2005, 15h22
  5. [ JSP ][ Débutant ] Passage d'objet par un forward
    Par captainpouet dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/04/2004, 10h33

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