【问题标题】:Segfault on destructor析构函数的段错误
【发布时间】:2012-01-08 22:19:13
【问题描述】:

当我关闭我的应用程序并且为这个类运行析构函数时,我对一个段错误感到沮丧。

vlocationdropdowns.h:

#include <QWidget>

class VLocationDropDowns : public QWidget
{
  Q_OBJECT
public:
  VLocationDropDowns(QString activeText, QWidget *parent = 0);
  ~VLocationDropDowns();
};

vlocationdropdowns.cpp:

VLocationDropDowns::VLocationDropDowns(QString activeText, QWidget *parent) :
 QWidget()//I've also had this as QWidget(parent, Qt::Widget)
{
}

VLocationDropDowns::~VLocationDropDowns()
{
}

我在另一个类的构造函数中创建了这个类的一个对象(locationLineEdit是一个指针)(也许我应该说这个类也继承自QWidget):

locationDropDowns = new VLocationDropDowns(randomString, this);

但是当该类的析构函数运行delete locationDropDowns; 时,我得到一个段错误。

我是管理内存的新手,所以我意识到这可能是一个菜鸟问题,但我现在已经搞砸了。我已经注释掉了我可以加入的所有内容 vlocationdropdowns.cpp 它仍然是段错误所以我现在不知道。这可能是什么原因造成的?

【问题讨论】:

  • 宏Q_OBJECT是什么?
  • 这是一个 Qt 宏。我认为它完成了所有信号和插槽的工作——老实说我不太确定,但我知道 Qt 需要它。我没有将此问题标记为 Qt,因为我认为 Qt 与它没有任何关系——我可能是错的。
  • 您使用的是new VLocationLineEdit,但您向我们展示了来自VLocationDropDowns 的一些代码。你不是要给我们看VLocationLineEdit吗?
  • Ja,抱歉,已修复 - 只是复制了错误的代码行...
  • 为什么不通过调试器运行?

标签: c++ qt constructor segmentation-fault


【解决方案1】:

我会按此顺序尝试一些建议:

  • 代码看起来没有错。尝试干净的构建。
  • 在析构函数中放置一个 printf 以查看它是否被调用。
  • 隔离成一个只执行新建和删除的小程序。
  • 试试不带Q_OBJECT
  • 以同样的方式尝试自行创建和删除QWidget
  • 为什么不使用传入构造函数的参数?

【讨论】:

  • 我尝试了一个干净的构建 - 没有。我使用调试器查看正在调用析构函数,确实如此。我发布这段代码的原因是我已经尽可能多地注释掉了这个类(在这个程度上),它仍然是段错误。我有另一个类(VLocationLineEdit)可以很好地解构。我想这可能是由于复制构造问题而导致的段错误(因此在发布的代码中没有使用参数)。我将建立一个新的独立项目,看看会发生什么。
  • 也许它被破坏了两次?将 printf 放入析构函数并not显式调用delete。也许其他一些代码首先调用析构函数。 (在 QT 中,如果一个小部件注册到某个窗口或类似的,它是否负责删除它?)
  • @j3frea,你试过 printfs/cout 吗?发生了什么?将cout &lt;&lt; "destructing" &lt;&lt; endl; 放入析构函数,并在删除后立即放入cout &lt;&lt; "deleted" &lt;&lt; endl;。然后告诉我们会发生什么。
  • 确实,它可能已经被删除了。根据上面的 cmets,您可能会有所收获。
  • "destructing" "程序意外结束。"
猜你喜欢
  • 2012-02-05
  • 2018-09-24
  • 1970-01-01
  • 2012-03-09
  • 2015-03-28
  • 1970-01-01
  • 2022-01-03
  • 2013-04-30
  • 2016-07-05
相关资源
最近更新 更多