C++ segfault通过迭代器访问qlist元素

C++ segfault通过迭代器访问qlist元素,c++,iterator,qlist,C++,Iterator,Qlist,我在遍历QList时得到一个segfault。我不明白我做错了什么 我有一份谈话清单。在对话中,我有一个Msg的QList。以下是课程描述: Msg类别: class Msg { public: Msg(); Msg(const Msg& other); Msg& operator=(const Msg& other); virtual ~Msg(); bool operator==(const Msg& other);

我在遍历QList时得到一个segfault。我不明白我做错了什么

我有一份谈话清单。在对话中,我有一个Msg的QList。以下是课程描述:

Msg类别:

class Msg {
public:
    Msg();
    Msg(const Msg& other);
    Msg& operator=(const Msg& other);
    virtual ~Msg();
    bool operator==(const Msg& other);

    QString         id()                   const { return _id; }
    MsgContact      author()               const { return _author; }
    MsgContact      dest()                 const { return _dest; }
    QDateTime       date()                 const { return _receivedDate; }
    MsgDirection    direction()            const { return _direction; }
    QString         text()                 const { return _text; }
    bool            transmitted()          const { return _transmitted; }

    void setId(const QString& id)                       { _id = id; }
    void setAuthor(const MsgContact& author)            { _author        = author; }
    void setDest(const MsgContact& dest)                { _dest          = dest; }
    void setDate(const QDateTime& receivedDate)         { _receivedDate  = receivedDate; }
    void setDirection(const MsgDirection& direction)    { _direction     = direction; }
    void setText(const QString& text)                   { _text          = text; }
    void setTransmitted(const bool& transmitted)        { _transmitted   = transmitted; }

private:
    QString _id;
    MsgContact _author;
    MsgContact _dest;
    QDateTime _receivedDate;
    MsgDirection _direction;
    QString _text;
    bool _transmitted; //indique que le message a été transmis
    bool _read; //indique la lecture
};
会话类:

class Conversation
{
public:
    Conversation();
    Conversation(const Conversation& other);
    virtual ~Conversation();
    Conversation& operator=(const Conversation& other);
    bool operator==(const Conversation& other);

    bool                  isNull()        const { return (NULL == _title || NULL == _destId); }
    const QString         title()         const       { return _title; }
    const QString         destId()        const       { return _destId; }
    QList<Msg>            messages()      const       { return _messages; }

    void setDestId(const QString& destId)    { _destId      = destId; }
    void setTitle(const QString& title)      { _title       = title; }

    void addMsg(const Msg& msg);

    static Conversation INVALID_CONVERSATION;

private:
    QList<Msg>   _messages;
    QString      _title;
    QString      _destId;
};

void Conversation::addMsg(const Msg& msg)
{
    _messages.append(msg);
}
课堂对话
{
公众:
会话();
对话(持续对话和其他);
虚拟会话();
会话和运算符=(常量会话和其他);
布尔运算符==(常量对话和其他);
bool isNull()常量{return(NULL==_title | | NULL==_destId)}
常量QString title()常量{return_title;}
常量QString destId()常量{return_destId;}
QList messages()常量{return_messages;}
void setDestId(const QString&destId){u destId=destId;}
void setTitle(const QString&title){{u title=title;}
无效添加消息(常量消息和消息);
静态会话无效的会话;
私人:
QList_消息;
QString_标题;
QString_destId;
};
无效对话::addMsg(const Msg&Msg)
{
_messages.append(msg);
}
生成segfault的代码。我创建了一条消息,在会话列表上迭代,将消息添加到相关会话中。然后,我想迭代消息列表,得到一个segfault。我用不同的方式来获取信息,效果很好

    Msg *m = new Msg();
    m->setId(xmppMsg.id());
    m->setDest(findContactById(conversationId));
    m->setDirection(MsgOutgoing);
    m->setAuthor(_myContact);
    m->setText(message);
    m->setDate(xmppMsg.stamp());

    QList<Conversation>::iterator it;
    for(it = _conversations.begin(); _conversations.end() != it; it++)
    {
        if((*it).destId() == conversationId)
        {
            (*it).addMsg(*m);
            Q_EMIT(conversationChanged((*it)));
            break;
        }
    }


    qDebug() << "NB : " <<(*it).messages().size(); // ok, the number of message is incremented.

    //test several way of accessing a message, these works fine.
    qDebug() << "doSend " << it->messages().at(0).id();  
    qDebug() << "doSend " << it->messages().begin()->id();
    qDebug() << "doSend " << (*(it->messages().begin())).id();


    //try to iterate
    QList<Msg>::iterator msgIt = it->messages().begin();
    if(msgIt != it->messages().end())
    {
        qDebug() << "TEST - "<<  msgIt->id();  //segfault. 
    }
Msg*m=new Msg();
m->setId(xmppMsg.id());
m->setDest(findContactById(conversationId));
m->设置方向(MsgOutgoing);
m->setAuthor(_myContact);
m->setText(消息);
m->setDate(xmppMsg.stamp());
QList::迭代器it;
for(it=_conversations.begin();_conversations.end()!=it;it++)
{
if((*it).destId()==会话ID)
{
(*it).addMsg(*m);
Q_EMIT(会话改变((*it));
打破
}
}
qDebug()(编辑掉第一个“答案”,这是对答案的实际尝试)

我猜:

QList<Msg>            messages()      const       { return _messages; }
QList messages()常量{return\u messages;}
它返回的是QList\u消息的副本,而不是对它的引用。我不确定它是否会给出你所看到的结果,但在我看来它是错的。也许试试这样的

QList<Msg>&            messages()      const       { return _messages; }
QList&messages()常量{return\u messages;}

嗯,你在调试器中单步执行了代码吗?@OldProgrammer看起来像,因为他们似乎知道segfault的确切位置。从这个问题来看,它看起来有点可疑,因为
qDebug()id()似乎工作正常。@是的,我使用了调试器。我检查了邮件是否正确插入我的列表。这似乎是因为消息的ID显示正确。但是,当使用迭代器时,它不起作用。我在调试器中看到迭代器指向0x0(NULL)