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

  1. #1
    Membre du Club
    Violation d'accès en lecture avec QMetaObject
    Bonjour, à tous,

    Je viens ici car j'ai un problème avec un code récupéré d'une ancienne version de Qt (5.6 et de mon côté je suis en 5.12.5). Lors du lancement, j'ai droit à une exception disant "The inferior stopped because it triggered an exception. Stopped in thread 0 by exception at 0x796d5058, code: 0xc0000005: read access violation at 0x10, flags=0x0 (first chance)." sous Qt Creator et "Exception levée à 0x01A35058 (Qt5Cored.dll) dans TestBench.exe*: 0xC0000005*: Violation d'accès lors de la lecture de l'emplacement 0x00000010.".

    La ligne en question est la suivante:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    m_handler = metaObject ()->method (metaObject ()->indexOfMethod (HANDLER));


    La partie posant problème est l'appel à la méthode "indexOfMethod". Le code est le suivant:

    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
    class QQmlObjectListModelBase : public QAbstractListModel { // abstract Qt base class
        Q_OBJECT
        Q_PROPERTY (int count READ count NOTIFY countChanged)
     
    public:
        explicit QQmlObjectListModelBase (QObject * parent = Q_NULLPTR) : QAbstractListModel (parent) { }
     
    public slots: // virtual methods API for QML
        virtual int size (void) const = 0;
        virtual int count (void) const = 0;
        virtual bool isEmpty (void) const = 0;
        virtual bool contains (QObject * item) const = 0;
        virtual int indexOf (QObject * item) const = 0;
        virtual int roleForName (const QByteArray & name) const = 0;
        virtual void clear (void) = 0;
        virtual void append (QObject * item) = 0;
        virtual void prepend (QObject * item) = 0;
        virtual void insert (int idx, QObject * item) = 0;
        virtual void move (int idx, int pos) = 0;
        virtual void remove (QObject * item) = 0;
        virtual void remove (int idx) = 0;
        virtual QObject * get (int idx) const = 0;
        virtual QObject * get (const QString & uid) const = 0;
        virtual QObject * getFirst (void) const = 0;
        virtual QObject * getLast (void) const = 0;
        virtual QVariantList toVarArray (void) const = 0;
     
    protected slots: // internal callback
        virtual void onItemPropertyChanged (void) = 0;
     
    signals: // notifier
        void countChanged (void);
    };
     
    template<class ItemType> class QQmlObjectListModel : public QQmlObjectListModelBase {
    public:
        explicit QQmlObjectListModel (QObject *          parent      = Q_NULLPTR,
                                      const QByteArray & displayRole = QByteArray (),
                                      const QByteArray & uidRole     = QByteArray ())
            : QQmlObjectListModelBase (parent)
            , m_count (0)
            , m_uidRoleName (uidRole)
            , m_dispRoleName (displayRole)
            , m_metaObj (ItemType::staticMetaObject)
        {
            static const char* HANDLER = "onItemPropertyChanged()";
     
            m_handler = metaObject ()->method (metaObject ()->indexOfMethod (HANDLER));
            if (!displayRole.isEmpty ()) {
                m_roles.insert (Qt:<img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />isplayRole, QByteArrayLiteral ("display"));
            }
        }
     
        void onItemPropertyChanged (void) Q_DECL_FINAL 
       {...}


    J'ai tenté de remplacer la ligne en question par le code suivant mais j'ai toujours le même problème.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const QMetaObject* pObject = metaObject();
    QByteArray signature= pObject->normalizedSignature(HANDLER);
    int idx = pObject->indexOfMethod(signature.data());
    m_handler = pObject->method(idx);


    Si quelqu'un à une idée.
    Merci d'avance.

  2. #2
    Responsable 2D/3D/Jeux

    Bonjour,

    Peut être pObject est NULL ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre du Club
    Merci de la réponse mais j'ai finis par trouver ce qu'il manquait comme informations par rapport au projet. Une partie est à compiler avec Visual Studio (les drivers) et la partie applicative avec GCC, et jusqu'à présent je n'utilisais que le compilateur de Visual studio.

    J'avais regardé pour pObject, il n'est pas nul mais son contenu oui c'est cela qui pose problème avec Visual studio mais avec GCC, c'est initialisé. Je ne vais pas chercher plus que cela pour le moment, je verrais ce point plus tard si j'ai le temps.

    Merci encore.