【发布时间】:2016-10-12 03:22:09
【问题描述】:
这是有问题的代码:
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 的原生对象系统,除了我想保证只有 IconWorking 在那里进行一些特殊处理。
我错过了什么?
更新:
我为每个 cmets 添加了一些测试代码,以查看 parentPage 是否发生变化。它没有。我正在使用在构造函数中分配并在析构函数中检查的新创建的变量。
段错误消息未指定地址。如果是这样就好了。直接检查指针会给出一个非零值,包括原始测试和添加的测试,因此它们不为空。
我还发现,当我添加一些功能时,我在一个完全不相关的位置获得了一个新的段错误,它引用了在整个程序的参数中传递的同一个 FullPage 实例。
【问题讨论】:
-
目前看不到任何问题。
parentPage的值是否仍然有效?段错误提到了哪个地址(例如 0 与其他地址)? -
removeIconWorking是虚拟的,这表明this指向一个无效的位置,并且当程序尝试取消引用指针以访问 vtable 时发生段错误。检查 parentPage 是否不为空。 -
在ctor中打印
parentPage和*parentPage,然后在dtor中再次打印,验证parentPage不变且*parentPage仍然合理。 -
你如何调用析构函数?通过删除其父级或删除
IconWorking?
标签: c++ qt segmentation-fault destructor