gpt4 book ai didi

c++ - 在引用调用上接收断言失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:02:07 26 4
gpt4 key购买 nike

(免责声明:我已经删除了 Qt 标签,以防问题出在我的语法/对此处涉及的引用文献的理解)

我有一个带有对象 Memberforeach 循环。当我枚举列表并尝试访问成员字段时,调试器停止并且我收到一条消息:

已停止:“收到信号” -

断言失败是:

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

我已经检查了该成员是否为 NULL,事实并非如此。我曾尝试重新编写代码,但在这个简单的调用中我一直失败。

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

代码如下:

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> > 中.如果你然后得到一个 null QPointer在调用 getMembers 后的列表中或者在循环期间的任何时候,对象必须在某个时候被销毁。

编辑

关于单例,你确定它被正确初始化了吗?换句话说 MemberList::getInstance()返回一个有效的指针还是一个随机的未初始化指针?

编辑2

既然我们已经用尽了大部分可能性,我想它一定在某个地方的单例中。我所能建议的就是继续查询列表中的第一项,以找出它到底哪里出了问题。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com