Hi.

I wrote simple test application that reproduse my problem.

The problem is in QScopedPointer at exit point

 inline T *data() const
{
    return d;
}

method.

Here is call stack:

Qt5Widgetsd.dll!QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> >::data() Line 132 C++ Qt5Widgetsd.dll!qGetPtrHelper<QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> > >(const QScopedPointer<QObjectData,QScopedPointerDeleter<QObjectData> > & p) Line 886 C++
     Qt5Widgetsd.dll!QApplication::d_func() Line 222    C++
     Qt5Widgetsd.dll!QWidget::~QWidget() Line 1432    C++
     Qt5Widgetsd.dll!QMainWindow::~QMainWindow() Line 379    C++
     test.exe!MainWindow::~MainWindow() Line 36    C++
test.exe!`MainWindow::instance'::`2'::`dynamic atexit destructor for 'inst''() C++
     msvcr110d.dll!doexit(int code, int quick, int retcaller) Line 585    C
     msvcr110d.dll!exit(int code) Line 395    C
     test.exe!__tmainCRTStartup() Line 549    C
     test.exe!mainCRTStartup() Line 377    C
     kernel32.dll!76f9336a()    Unknown
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]
     ntdll.dll!77d49f72()    Unknown
     ntdll.dll!77d49f45()    Unknown

But why?

Here  is the code:


#include  <QApplication>

#include  <QMainWindow>

#include  <QWidget>

#include  <QScopedPointer>

#include  <QMenuBar>

#include  <QMenu>

class  MainWindowPrivate  {

public:

        MainWindowPrivate()

                :       m_widget(  0  )

        {

        }

        QWidget  *  m_widget;

};

class  MainWindow

        :       public  QMainWindow

{

        Q_OBJECT

private:

        MainWindow(  QWidget  *  parent  =  0,  Qt::WindowFlags  f  =  0  )

                :       QMainWindow(  parent,  f  )

                ,       d(  new  MainWindowPrivate  )

        {

                init();

        }

        ~MainWindow()

        {

        }

public:

        static  MainWindow  &  instance()

        {

                static  MainWindow  inst;

                return  inst;

        }

private:

        void  init()

        {

                QMenu  *  fileMenu  =  menuBar()->addMenu(  tr(  "&File"  )  );

                fileMenu->addAction(  QIcon(),

                        tr(  "E&xit"  ),  qApp,  SLOT(  quit()  ),

                        QKeySequence(  tr(  "Ctrl+Q"  )  )  );

                d->m_widget  =  new  QWidget(  this  );

                setCentralWidget(  d->m_widget  );

        }

private:

        Q_DISABLE_COPY(  MainWindow  )

        QScopedPointer<  MainWindowPrivate  >  d;

};

int  main(  int  argc,  char  **  argv  )

{

        QApplication  app(  argc,  argv  );

        MainWindow::instance().show();

        return  app.exec();

}

#include  "main.moc"


#include <QApplication>
#include <QMainWindow>
#include <QWidget>
#include <QScopedPointer>
#include <QMenuBar>
#include <QMenu>


class MainWindowPrivate {
public:
	MainWindowPrivate()
		:	m_widget( 0 )
	{
	}

	QWidget * m_widget;
};


class MainWindow
	:	public QMainWindow
{
	Q_OBJECT

private:
	MainWindow( QWidget * parent = 0, Qt::WindowFlags f = 0 )
		:	QMainWindow( parent, f )
		,	d( new MainWindowPrivate )
	{
		init();
	}

	~MainWindow()
	{
	}

public:
	static MainWindow & instance()
	{
		static MainWindow inst;

		return inst;
	}

private:
	void init()
	{
		QMenu * fileMenu = menuBar()->addMenu( tr( "&File" ) );

		fileMenu->addAction( QIcon(),
			tr( "E&xit" ), qApp, SLOT( quit() ),
			QKeySequence( tr( "Ctrl+Q" ) ) );

		d->m_widget = new QWidget( this );

		setCentralWidget( d->m_widget );
	}

private:
	Q_DISABLE_COPY( MainWindow )

	QScopedPointer< MainWindowPrivate > d;
};


int main( int argc, char ** argv )
{
	QApplication app( argc, argv );

	MainWindow::instance().show();

	return app.exec();
}

#include "main.moc"
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to