私が理解しているように、Qtのイベントループ内で発生する例外を処理する方法は、QApplication :: notify()をオーバーライドしてそこで処理することです。私はそれを試しました、そしてそれはうまくいきます:
class Application : public QApplication
{
Q_OBJECT
public:
explicit Application( int& argc, char** argv );
// override to handle out of memory exceptions
bool notify( QObject* receiver, QEvent* e );
signals:
public slots:
private:
char* m_buffer;
};
Application::Application(int &argc, char **argv)
:QApplication( argc, argv )
{
m_buffer = new char[1024*1024];
}
bool Application::notify(QObject *receiver, QEvent *e)
{
try
{
return QApplication::notify( receiver, e );
}
catch( std::bad_alloc& )
{
if ( m_buffer )
{
delete[] m_buffer;
m_buffer = NULL;
}
// calling QMessageBox from here doesn't work
// even if release a load of reserved memory
// don't know why
QMessageBox::critical( NULL, "Exception", "Application out of memory" );
}
ただし、メッセージボックスが表示されたときは空白です(つまり、正しくレンダリングされていません)。プロセスに十分なメモリがなかったのではないかと思いました。そこで、最初に1MBのメモリを割り当て(上記のm_bufferを参照)、QMessageBoxが表示される前に解放してみました。しかし、それもうまくいきませんでした。何か案は?