(免责声明:如果问题出在我的语法/对此处涉及的引用的理解中,我已删除了Qt标签)
我有一个对象foreachMember循环。当我枚举列表并尝试访问成员字段时,调试器将停止并显示一条消息:Stopped: 'signal-received'-
断言失败是:

inline QString::QString(const QString &other) : d(other.d)
{ Q_ASSERT(&other != this); d->ref.ref(); }
我检查了成员是否为NULL,事实并非如此。我尝试重新编写代码,但在此简单调用上仍然失败。
我错过了一些事情。 MemberList是一个单例(已明确初始化并返回有效指针),该单例是在应用程序启动并使用文件中的Members填充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是私有(private)变量。

最终答案:
我决定完全重做单例,发现我没有实例化新成员,而是一遍又一遍地重用以前的对象。这引起了双重引用。假设那是您的指针。特别感谢Troubadour的努力!

最佳答案

如果mem不为null,则指针仍然悬空的情况仍然存在,即它指向的Member已被删除。

如果Member继承自QObject,则可以暂时将存储在QList<Member*>中的ml(假设这是ml中存储的内容)更改为QList< QPointer<Member> >。如果您在调用QPointer之后或循环中的任何时候在列表中获得了一个空的getMembers,则该对象一定已被销毁。

编辑

至于单例,您确定它已正确初始化吗?换句话说,MemberList::getInstance()返回的是有效指针还是随机的未初始化指针?

编辑2

由于我们已经用尽了大多数可能性,所以我想它一定在某个地方的单例中。我所建议的就是继续查询列表中的第一项,以找出发生问题的确切位置。

关于c++ - 在引用调用上接收断言失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3520931/

10-11 16:12