Перейти к содержанию

Очень странный баг...


Рекомендуемые сообщения

Привет всем! Ситуация такая: есть проект на QT.

Есть библиотека(mathprov.so) в которой содержится следующее:

//libs.h
#ifndef MYLIBS_H
#define MYLIBS_H
#ifdef Q_WS_WIN
# define EXPORT __declspec(dllexport)
#else
# define EXPORT
#endif
void __attribute__ ((constructor)) initialize(void);
void __attribute__ ((destructor)) finalize(void);
#endif
//mathprov.h
#ifndef MATHPROV_H
#define MATHPROV_H
#include "../libs.h"
class QWidget;
class PartTypeDialog;
QWidget* parent;
PartTypeDialog* partTypeDialog;
extern "C" {    
    EXPORT void setParentWidget(QWidget* p);
    EXPORT QWidget* getPartTypeDialog();
}
#endif
//mathprov.cpp
void initialize()
{
    partTypeDialog = 0;
}
void finalize()
{ }
QWidget* getPartTypeDialog()
{
    if (partTypeDialog == 0)
        partTypeDialog = new PartTypeDialog(parent);
    return (QWidget*)partTypeDialog;
}
void setParentWidget(QWidget* p)
{
    parent = p;
}

PartTypeDialog это некий наследник QWidget. Далее основная программа:

//CourseWindow.h
class CourseWindow : public QMainWindow
{
<...>
    QLibrary* libMathProv; QWorkspace* ws;
};
//coursewindow.cpp
CourseWindow::CourseWindow(QWidget *parent, const char *name)
 : QMainWindow(parent, name), libMathProv(0)
{
    <...>
    ws = new QWorkspace( <...> );
    ws->setScrollBarsEnabled( TRUE );
    connect(ws, SIGNAL(windowActivated(QWidget*)), this, SLOT(ws_windowActivated(QWidget* )));
}
void CourseWindow::ws_windowActivated ( QWidget * w )
{
    if (w == 0) //unload library
         libMathProv->unload(); 
}
void CourseWindow::somefunc()
{
    <...>
    lib = new QLibrary("mathprov");
    lib->setAutoUnload(false);
    setParent = (psetparentfunc)lib->resolve( "setParentWidget" );    
    getDialog = (pgetdialogfunc)lib->resolve("getPartTypeDialog");   
    setParent(ws);
    getDialog()->show();
}

Ошибка сегментации возникает когда закрываешь окно(PartTypeDialog) и предком является QWorkspace. А если выйти из моей проги не закрывая PartTypeDialog, или вместо PartTypeDialog использовать любой стандартный QT-шный класс(наследник QWidget), то ошибки не происходит. Вы можете объяснить такое явление???

Если даже PartTypeDialog выглядит так:

class PartTypeDialog : public QWidget
{
Q_OBJECT
public:
    PartTypeDialog(QWidget *parent = 0, const char *name = 0): QWidget(parent, name)
};

--------

Заранее примного благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...