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

Boost C++ Discussion :

[Serialization]Runtime error au démmarage


Sujet :

Boost C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut [Serialization]Runtime error au démmarage
    Bonjour.

    Récemment, je me suis mis à utiliser boost serialization. tout marchait bien sur des exemples simples, mais avec une classe complexe, j'obtient une erreur vraiment etrange:
    Citation Envoyé par gcc
    /.../boost/serialization/singleton.hpp:124: static T& boost::serialization::singleton<T>::get_instance() [with T = boost::archive::detail::iserializer<boost::archive::text_iarchive, std::vector<EigMemberProps<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<EigMemberProps<int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > > > > >]: Assertion `! detail::singleton_wrapper<T>::m_is_destroyed' failed.
    le code impliqué est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "FaceBase.h"
    int main()
    {
      FaceBase< EigMemberProps<int,std::string> > F(std::string("facebase.archive"));
       return 0;
    }
    avec comme prototype de facebase (simplifié):
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #ifndef FACEBASE_H_INCLUDED
    #define FACEBASE_H_INCLUDED
    #include "EigMemberProps.h"
     
    #include <boost/serialization/vector.hpp>
     
    #include <boost/archive/text_oarchive.hpp>
    #include <boost/archive/text_iarchive.hpp>
     
    template < class Props>
    class FaceBase
    {
      private:
      FaceBase();
    };
     
    template < class T,class U>
    class FaceBase<EigMemberProps<T,U> >
    {
      protected:
      std::vector< EigMemberProps<T,U> > members;
      CvMat * EigenFacesVectors;//Eigen Faces float
      CvMat * EigenFaces;//projected faces float
      CvMat * Faces;//Faces database unsigned char
      CvMat* Average;//Average Face
     
      public:
      //FaceBase();
      FaceBase( const std::string & );
     
      ~FaceBase();
     
      private:
      friend class boost::serialization::access;
      template<class Archive>
      void save(Archive & ar, const unsigned int version) const;
      template<class Archive>
      void load(Archive & ar, const unsigned int version) ;
      BOOST_SERIALIZATION_SPLIT_MEMBER()
    };
     
    #include "FaceBase.hpp"
    #endif // FACEBASE_H_INCLUDED
    et les deux fonctions de serialisations sont:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    template < class T,class U> template<class Archive>
    void FaceBase<EigMemberProps<T,U> >::
    save(Archive & ar, const unsigned int ) const
    {
      ar & members;
      int pcols=0,prows=0;
      if(EigenFacesVectors)
      {
        ar & EigenFacesVectors->cols;
        ar & EigenFacesVectors->rows;
        for (int i=0;i!=EigenFacesVectors->rows;++i)
          for(int j=0;j!=EigenFacesVectors->cols;++j)
            ar & CV_MAT_ELEM(*EigenFacesVectors,float,i,j);
      }
      else
      {
        ar & pcols;
        ar & prows;
      }
      if(EigenFaces)
      {
        ar & EigenFaces->cols;
        ar & EigenFaces->rows;
        for (int i=0;i!=EigenFaces->rows;++i)
          for(int j=0;j!=EigenFaces->cols;++j)
            ar & CV_MAT_ELEM(*EigenFaces,float,i,j);
      }
      else
      {
        ar & pcols;
        ar & prows;
      }
      if(Faces)
      {
        ar & Faces->cols;
        ar & Faces->rows;
        for (int i=0;i!=Faces->rows;++i)
          for(int j=0;j!=Faces->cols;++j)
            ar & CV_MAT_ELEM(*Faces,unsigned char,i,j);
      }
      else
      {
        ar & pcols;
        ar & prows;
      }
      if(Average)
      {
        ar & Average->cols;
        ar & Average->rows;
        for (int i=0;i!=Average->rows;++i)
          for(int j=0;j!=Average->cols;++j)
            ar & CV_MAT_ELEM(*Average,unsigned char,i,j);
      }
      else
      {
        ar & pcols;
        ar & prows;
      }
    }
     
    template < class T,class U> template<class Archive>
    void FaceBase<EigMemberProps<T,U> >::
    load(Archive & ar, const unsigned int )
    {
      ar & members;
      int pcols,prow;
      ar & pcols;
      ar & prow;
      if(pcols==0 || prow==0)
        EigenFacesVectors=NULL;
      else
      {
        EigenFacesVectors=cvCreateMat(prow,pcols,CV_32FC1);
        for (int i=0;i!=EigenFacesVectors->rows;++i)
          for(int j=0;j!=EigenFacesVectors->cols;++j)
            ar & CV_MAT_ELEM(*EigenFacesVectors,float,i,j);
      }
      ar & pcols;
      ar & prow;
      if(pcols==0 || prow==0)
        EigenFaces=NULL;
      else
      {
        EigenFaces=cvCreateMat(prow,pcols,CV_32FC1);
        for (int i=0;i!=EigenFaces->rows;++i)
          for(int j=0;j!=EigenFaces->cols;++j)
            ar & CV_MAT_ELEM(*EigenFaces,float,i,j);
      }
      ar & pcols;
      ar & prow;
      if(pcols==0 || prow==0)
        Faces=NULL;
      else
      {
        Faces=cvCreateMat(prow,pcols,CV_8UC1);
        for (int i=0;i!=Faces->rows;++i)
          for(int j=0;j!=Faces->cols;++j)
            ar & CV_MAT_ELEM(*Faces,unsigned char,i,j);
      }
      ar & pcols;
      ar & prow;
      if(pcols==0 || prow==0)
        Average=NULL;
      else
      {
        Average=cvCreateMat(prow,pcols,CV_8UC1);
        for (int i=0;i!= Average->rows;++i)
          for(int j=0;j!= Average->cols;++j)
            ar & CV_MAT_ELEM(*Average,unsigned char,i,j);
      }
    }
    Sachant que le constructeur appelle ces fonctions, ainsi que le destructeur. (une sorte d'auto sauvegarde)

    Ce qui est étonnant, c'est que l'erreur se produit avant même que le constructeur ou le destructeurs aient été appelés.

    si vous avez une idée...

    Merci

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

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Sa veut dire que le singleton est détruit au moment où t'essayes de l'appeller. (le singleton en interne hein).
    A mon avis le singleton doit être détruit avant ton Facebase ... donc dans le destructeur ça fail .

    Atta, tu mets "envoyé par gcc" mais c'est au runtime hein, c'est une assertion ..

  3. #3
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Goten Voir le message
    Sa veut dire que le singleton est détruit au moment où t'essayes de l'appeller. (le singleton en interne hein).
    A mon avis le singleton doit être détruit avant ton Facebase ... donc dans le destructeur ça fail .
    Comment c'est possible ? o_O quel objet peut-il construire et détruire avant de construire le facebase (et c'est quoi ce facebase ). en plus, même si je commente la sauvegarde dans de destructeur, j'ai le même problème.

    Sinon, c'est quoi ce singleton ?

    Citation Envoyé par Goten Voir le message
    Atta, tu mets "envoyé par gcc" mais c'est au runtime hein, c'est une assertion ..
    Heu oui, mauvais réflexe. j'aurais dû mettre envoyé par gnome-terminal...

  4. #4
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    FaceBase< EigMemberProps<int,std::string> > F(std::string("facebase.archive"));


    C'est ça que j'ai appellé facebase :'). Autant pour moi. T'as pas compris le raisonnement que j'ai tenu (mais qui à l'air faux donc) :
    en interne serialization gére un singleton qui est surement détruit avant ton objet F et donc avant l'appel à ~F.

  5. #5
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Goten Voir le message
    FaceBase< EigMemberProps<int,std::string> > F(std::string("facebase.archive"));


    C'est ça que j'ai appellé facebase :'). Autant pour moi. T'as pas compris le raisonnement que j'ai tenu (mais qui à l'air faux donc) :
    en interne serialization gére un singleton qui est surement détruit avant ton objet F et donc avant l'appel à ~F.
    oui, c'est ce que semble dire le message d'erreur... par contre, j'aimerais bien savoir comment éviter ça :s

    je vas poster la question sur boost-users

  6. #6
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    le problème semble se ramener à la serializetion d'un vecteur.

    J'ai préférer créer un nouveau thread pour être plus clair.

Discussions similaires

  1. Runtime error avec UDF/DLL
    Par pram dans le forum SQL
    Réponses: 6
    Dernier message: 22/04/2005, 10h30
  2. [LG]Runtime Error lors d'une recherche dans un fichier
    Par Fraynor dans le forum Langage
    Réponses: 2
    Dernier message: 15/03/2005, 22h51
  3. [TP]Runtime error 106 à l'exécution
    Par BlackTiger dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 25/01/2004, 21h50
  4. [LG]runtime error 202
    Par picsou123 dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2003, 22h53
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

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