gpt4 book ai didi

c++ - 调用成员->函数(this);在析构函数中导致段错误

转载 作者:行者123 更新时间:2023-11-30 03:40:53 27 4
gpt4 key购买 nike

这是有问题的代码:

class FullPage : public QWidget
{
Q_OBJECT
public:
explicit FullPage(const AppData* appdata, QWidget* parent = 0);
virtual void addIconWorking(IconWorking* temp);
virtual void removeIconWorking(IconWorking* temp);
...
}

class IconWorking : public QLabel
{
Q_OBJECT
public:
explicit IconWorking(FullPage* parent = 0);
virtual ~IconWorking();
...
}

IconWorking::IconWorking(FullPage* parent) : QLabel(parent)
{
...
parentPage = parent;
parentPage->addIconWorking(this);
...
}

IconWorking::~IconWorking()
{
parentPage->removeIconWorking(this); //segfault
QMessageBox::information(0, "TODO", "Reminder Message");
}
  • 调用前标记的行段错误。 (断点命中,但函数内的断点未命中)
  • parentPage 永远不会被删除,并且此时具有非零值。
  • FullPage::add/removeIconWorking(IconWorking*) 不对对象本身做任何事情;他们只是在 QList 中添加/删除它。类似于 Qt 的 native 对象系统,除了我想保证只有 IconWorking 在那里进行一些特殊处理。

我错过了什么?


更新:

我根据评论添加了一些测试代码,以查看 parentPage 是否发生过更改。它没有。我正在使用在构造函数中分配并在析构函数中检查的新创建的变量。

段错误消息没有指定地址。如果它这样做会很好。直接检查指针会给出非零值,包括原始测试和添加的测试,因此它们不为空。

我还发现,当我添加一些功能时,我在一个完全不相关的位置得到了一个新的段错误,它引用了在整个程序的参数中传递的同一个 FullPage 实例。

最佳答案

假设 ~IconWorking() 在其 parentPage 被销毁时被调用,如父子关系所示:

当 parentPage 对象被销毁时,事情会按以下顺序发生:

  1. ~FullPage()parentPage 实例上调用。之后,parentPage 不再是有效的 FullPage 对象!
  2. ~Widget() 被调用,留下一个 QObject。
  3. ~QObject() 被调用,它删除了你的 IconWorking 对象(因为父子关系)
  4. ~IconWorking() 被执行,它在 parentPage 上调用 FullPage::removeIconWorking(),我假设,它访问已在步骤 1 中销毁的 FullPage 特定成员。(对象 parentPage 指向to 在这一点上只是一个有效的 QObject,没有别的!)
  5. 崩溃

要使这种方法起作用,~FullPage() 必须手动删除 IconWorking 对象,而不是依赖于 QObject 父子关系。

关于c++ - 调用成员->函数(this);在析构函数中导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37760416/

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