在参考呼叫上接收断言失败

时间:2010-08-19 10:40:33

标签: c++ pass-by-reference

(免责声明:我已删除了Qt标签,以防问题出现在我的语法/理解此处涉及的参考资料中)

我有一个foreach循环,其中包含一个对象Member。当我通过列表枚举并尝试访问成员字段时,调试器停止并收到一条消息:

Stopped: 'signal-received' -

断言失败是:

inline QString::QString(const QString &other) : d(other.d)
{ Q_ASSERT(&other != this); d->ref.ref(); }

我已经检查过该成员是否为NULL,而不是。我已经尝试过重新编写代码了,但是我一直都没有通过这个简单的调用。

有些事我错过了。 MemberList是一个单例(明确初始化并返回一个有效指针),它是在应用程序启动时创建的,并使用文件中的成员填充MemberList。创建它时,肯定有值,因为我将它们打印到qDebug()。这个页面就是下一页。我不确定如何销毁List项目。

代码如下:

int i = 0;

QList<Member*> members = ml->getMembers();

foreach (Member* mem, members)
{
    QString memID = mem->getMemberID(); // Crash happens here

    QListWidgetItem *lstItem = new QListWidgetItem(memID, lsvMembers);
    lsvMembers->insertItem(i, lstItem);
    i++;
}   

会员类获得如下:

QString getMemberID() const;

,实际功能是:

QString Member::getMemberID() const
{
    return MemberID;
}

收到ml变量如下:

QList<Member*> MemberList::getMembers()
{
    return MemberList::getInstance()->memberList;
}

memberList是私有变量。


最终答案:

我决定彻底改造单身人士,发现我没有实例化一个新成员,而是一遍又一遍地重复使用前一个对象。这引起了双重参考。这就是你的指针。特别感谢Troubadour的努力!

1 个答案:

答案 0 :(得分:0)

如果mem不为空,则仍可能是指针悬空,即它指向的Member已被删除。

如果Member继承自QObject,那么您可以暂时将QList<Member*>中存储的ml(假设存储在ml中的内容)更改为QList< QPointer<Member> >。如果您在调用QPointer之后或在循环期间的任何时刻在列表中获得空getMembers,则该对象必须在某个时刻被销毁。

修改

关于单身人士,你确定它是正确的吗?换句话说,MemberList::getInstance()是返回有效指针还是只是一个未经初始化的未指定的指针?

<强> EDIT2

由于我们已经耗尽了大多数可能性,我想它必须在某个地方的单身人士中。我可以建议的是继续查询列表中的第一项,以找出它变坏的确切位置。