(免责声明:如果问题出在我的语法/对此处涉及的引用的理解中,我已删除了Qt标签)
我有一个对象foreach
的Member
循环。当我枚举列表并尝试访问成员字段时,调试器将停止并显示一条消息: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/