2015-02-05 13 views
0

Я использую Qt для разработки аппликации, для которой я вижу ошибку сегментации в своем деструкторе моего виртуального базового класса при выходе из приложения. Я думаю, что это связано с объявлением переменной-члена static, но я не уверен. Любые указатели на то, что происходит, помогут. Ниже приведен пример кода. Для ясности я удалил все функции-члены.Ошибка сегментации в деструкторе базового класса 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 не существует во время вызова деструктора, но она виртуальна!

BTW, я избавился от проблемы, сделав m_base указателем на базовый класс и создав его в определении, но мне все же хотелось бы знать, что не так с кодом выше.

Спасибо!

+5

Какой компилятор вы используете? Это не должно было позволить вам создавать экземпляр класса с помощью виртуальных функций. – inetknght

+1

Это не должно компилироваться даже после добавления отсутствующих спецификаторов ';' и 'public'. 'Base 'является абстрактным, поэтому вы не можете объявить переменную этого типа. Пожалуйста, отправьте код, который компилирует и демонстрирует вашу ошибку. –

+3

Вы должны определить деструктор (придать ему тело), ​​хотя это чистый виртуальный. Обратите внимание, что вы не можете сделать это в классе. –

ответ

3

Ваш пример кода неверен, потому что вы не можете создать экземпляр базы, поскольку он является абстрактным.

Пожалуйста, будьте более конкретным.

EDIT: Я все еще не уверен, как это компилируется, но Вы должны добавить реализацию базового деструкторов:

Base::~Base() 
{ 
} 
+0

Извините, мои извинения. Это Child1 not Base. Это была просто опечатка, когда я писал это. Это код Child1 в коде. – GMahan

+0

Что значит «это ребенок1»? Корректируйте свой код соответственно. –

+0

@GMahan Используйте ссылку [edit] (http://stackoverflow.com/posts/28347741/edit), чтобы исправить свой вопрос. –

Смежные вопросы