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 :

Utilisation de classes d'une shared library dans mon application principale.


Sujet :

C++

Vue hybride

piemur2000 Utilisation de classes d'une... 23/09/2011, 15h05
Klaim Moi je serais toi, je... 23/09/2011, 15h23
piemur2000 Le destructeur est bien... 23/09/2011, 15h33
dragonjoker59 le new et le delete doivent... 26/09/2011, 10h07
Klaim Exactement, c'est ce que je... 26/09/2011, 14h30
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Par défaut Utilisation de classes d'une shared library dans mon application principale.
    Bonjour,

    J'ai un programme en C++ sous linux qui utilise une librairie dynamique. Après le chargement de ma librairie j'appelle une fonction d'initialisation qui crée des objets et les ajoute à un conteneur de mon application principale. Ces objets de type AA dérivent d'une classe de mon appli A.

    A <- AA

    Application :
    conteneur.add(new A());

    Librairie :
    conteneur.add(new AA());

    Lorsque je vide mon conteneur et que je supprime mes objets de type AA j'ai un segmentation fault. Après quelques recherches sur le net j'ai trouvé cet article qu'il faut passer par des fonctions create_object et destroy_object pour allouer ou supprimer des objets d'une shared library.

    Ma question est de savoir pourquoi il faut passer par ces fonctions? Comment fonctionne exactement l'allocation/desallocation d'objets et l'appel de fonctions dans une shared library?

  2. #2
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Moi je serais toi, je vérifierai :

    1. est-ce que j'ai bien mis un déstructeur virtuel dans A?
    2. est-ce que je ne me retrouve pas dans un cas ou je tente de deleter un objet qui l'est déjà? vérifier les algorithms gérant els objets, faire du log ou du breakpoint.


    Enfin, si tes mémoires ne sont pas partagées entre dlls et application, il faut que le new et le delete soient fait dans le même module. Sinon tu peux avoir des surprises.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 87
    Par défaut
    Citation Envoyé par Klaim Voir le message
    1. est-ce que j'ai bien mis un déstructeur virtuel dans A?
    Le destructeur est bien virtuel.

    Citation Envoyé par Klaim Voir le message
    2. est-ce que je ne me retrouve pas dans un cas ou je tente de deleter un objet qui l'est déjà? vérifier les algorithms gérant els objets, faire du log ou du breakpoint.
    Les objets sont bien supprimé qu'une seule fois. J'ai fait un petit programme de test qui fonctionne si je fais les new et delete dans la lib et crash si je fais un new dans la lib et delete dans l'appli.

  4. #4
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 032
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 032
    Billets dans le blog
    12
    Par défaut
    le new et le delete doivent etre soit les deux dans l'appli, soit les deux dans la library, car une shared library a son propre espace de mémoire.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Exactement, c'est ce que je voulais dire par

    Enfin, si tes mémoires ne sont pas partagées entre dlls et application, il faut que le new et le delete soient fait dans le même module. Sinon tu peux avoir des surprises.
    (paceque pour moi l'appli est un module "maitre")

    Dans tous les cas, globalement la technique pour résoudre ce probleme consiste à

    1. mettre en place une ou plusieurs fonctions dont l'application connait le nom et la signature mais qui sont implémentés dans chacun des modules externes (dlls)
    2. cette fonction fournis des factory (objets ou fonction) qui servent a créer les objets issus du module mais avec des interfaces connues de l'application.

    Les détails dépendent totalement du de communicatino entre application et modules. Si tu veux des idées, jettes un oeil à comment boost.extension (pas encore dans boost) fonctionne conceptuellement : http://boost-extension.redshoelace.c...ion/index.html

Discussions similaires

  1. lancer une page web dans mon application
    Par monta_amri dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 09/06/2015, 14h03
  2. Réponses: 1
    Dernier message: 14/06/2011, 07h53
  3. Réponses: 1
    Dernier message: 19/04/2010, 14h24
  4. Utiliser le résultat d'une chaine sql dans une autre
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 10/05/2009, 09h00
  5. Réponses: 3
    Dernier message: 01/12/2008, 17h20

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