(免责声明:我已删除了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的努力!
答案 0 :(得分:0)
如果mem
不为空,则仍可能是指针悬空,即它指向的Member
已被删除。
如果Member
继承自QObject
,那么您可以暂时将QList<Member*>
中存储的ml
(假设存储在ml
中的内容)更改为QList< QPointer<Member> >
。如果您在调用QPointer
之后或在循环期间的任何时刻在列表中获得空getMembers
,则该对象必须在某个时刻被销毁。
修改强>
关于单身人士,你确定它是正确的吗?换句话说,MemberList::getInstance()
是返回有效指针还是只是一个未经初始化的未指定的指针?
<强> EDIT2 强>
由于我们已经耗尽了大多数可能性,我想它必须在某个地方的单身人士中。我可以建议的是继续查询列表中的第一项,以找出它变坏的确切位置。