2015-02-05 118 views
0

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

在头文件:

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指向基类,并在定义中实例化它,但我仍然想知道上面的代码有什么问题。

谢谢!

+5

什么编译您使用的?它不应该允许你用纯虚函数实例化一个类。 – inetknght 2015-02-05 15:30:06

+1

即使在添加缺少的';'和'public'说明符后,也不应编译。 'Base'是抽象的,所以你不能声明这种类型的变量。请发布编译并演示错误的代码。 – 2015-02-05 15:31:24

+3

您必须定义析构函数(给它一个正文),即使它是纯虚拟的。请注意,你不能在课堂上做。 – 2015-02-05 15:31:52

回答

3

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

请更具体一些。

编辑: 我仍然不知道如何编译,但你将不得不加入碱析构函数的实现:

Base::~Base() 
{ 
} 
+0

对不起,我的道歉。它是Child1而不是Base。写这篇文章只是一个错字。它是代码中的Child1。 – GMahan 2015-02-05 15:35:02

+0

你是什么意思“它是Child1”?请相应地更正您的代码。 – 2015-02-05 15:35:56

+0

@GMahan使用[edit](http://stackoverflow.com/posts/28347741/edit)链接更正您的问题。 – 2015-02-05 15:38:38