【问题标题】:Segmentation fault in base class destructor C++ [duplicate]基类析构函数C ++中的分段错误[重复]
【发布时间】:2015-04-05 12:44:47
【问题描述】:

我正在使用 Qt 开发一个应用程序,我在退出应用程序时在我的虚拟基类的析构函数中看到分段错误。我认为这与声明成员变量静态有关,但我不确定。任何有关正在发生的事情的指示都会有所帮助。下面是我的示例代码。为了清楚起见,我删除了所有成员函数。

在头文件中:

class Base : public QObject
{   
     public:
     Base() {}
     virtual ~Base() = 0; /// Fault occurs here in the debugger
};

class Child1: public Base
{
   public:
    Child1() {}
    ~Child1() {}
};

class Service 
{
   public:
     Service() {}
    ~Service() {}
private:
    static Child1 m_base;
};

在源文件中:

Child1 Service::m_base;

当我退出应用程序时,我在基类析构函数中遇到了分段错误。是不是因为调用析构函数的时候m_base静态成员变量不存在,而是虚拟的!

顺便说一句,我通过使 m_base 成为指向 Base 类的指针并在定义中实例化它来解决这个问题,但我仍然想知道上面的代码有什么问题。

谢谢!

【问题讨论】:

  • 你用的是什么编译器?它不应该允许你用纯虚函数实例化一个类。
  • 这不应该编译,即使添加了缺少的 ;public 说明符。 Base 是抽象的,因此您不能声明该类型的变量。请发布编译并演示您的错误的代码。
  • 您必须定义析构函数(给它一个主体),即使它是纯虚拟的。请注意,您不能在课堂上进行。

标签: c++ qt static-members


【解决方案1】:

您的示例代码不正确,因为您无法为 Base 创建实例,因为它是抽象的。

请更具体。

编辑: 我仍然不确定它是如何编译的,但是您必须添加 Base 析构函数实现:

Base::~Base()
{
}

【讨论】:

  • 对不起,我很抱歉。这是 Child1 而不是 Base。只是写这篇文章的时候打错了。代码中是 Child1。
  • “它是 Child1”是什么意思?请相应地更正您的代码。
  • @GMahan 使用edit 链接更正您的问题。
  • 我已经对上面的代码进行了更正。
  • 为纯虚拟基类析构函数定义一个实现似乎已经解决了这个问题。感谢您指出了这一点。至于编译错误,我的原始代码(此处未发布)似乎可以编译,即使没有实现纯虚拟析构函数。但是,当我尝试编译上面的代码时,它失败了。我不确定为什么要编译原始代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2013-11-01
  • 2021-07-15
  • 2016-07-05
  • 1970-01-01
  • 2021-04-05
  • 2013-04-30
相关资源
最近更新 更多