Skip to content

Commit

Permalink
qt: Avoid shutdownwindow-related memory leak
Browse files Browse the repository at this point in the history
Store a reference to the shutdown window on BitcoinApplication,
so that it will be deleted when exiting the main loop.
  • Loading branch information
laanwj committed Nov 23, 2016
1 parent e4f126a commit 5204598
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 7 deletions.
3 changes: 2 additions & 1 deletion src/qt/bitcoin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,7 @@ public Q_SLOTS:
#endif
int returnValue;
const PlatformStyle *platformStyle;
std::unique_ptr<QWidget> shutdownWindow;

void startThread();
};
Expand Down Expand Up @@ -411,7 +412,7 @@ void BitcoinApplication::requestShutdown()
// Show a simple window indicating shutdown status
// Do this first as some of the steps may take some time below,
// for example the RPC console may still be executing a command.
ShutdownWindow::showShutdownWindow(window);
shutdownWindow.reset(ShutdownWindow::showShutdownWindow(window));

qDebug() << __func__ << ": Requesting shutdown";
startThread();
Expand Down
8 changes: 3 additions & 5 deletions src/qt/utilitydialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,22 +171,20 @@ ShutdownWindow::ShutdownWindow(QWidget *parent, Qt::WindowFlags f):
setLayout(layout);
}

void ShutdownWindow::showShutdownWindow(BitcoinGUI *window)
QWidget *ShutdownWindow::showShutdownWindow(BitcoinGUI *window)
{
if (!window)
return;
return nullptr;

// Show a simple window indicating shutdown status
QWidget *shutdownWindow = new ShutdownWindow();
// We don't hold a direct pointer to the shutdown window after creation, so use
// Qt::WA_DeleteOnClose to make sure that the window will be deleted eventually.
shutdownWindow->setAttribute(Qt::WA_DeleteOnClose);
shutdownWindow->setWindowTitle(window->windowTitle());

// Center shutdown window at where main window was
const QPoint global = window->mapToGlobal(window->rect().center());
shutdownWindow->move(global.x() - shutdownWindow->width() / 2, global.y() - shutdownWindow->height() / 2);
shutdownWindow->show();
return shutdownWindow;
}

void ShutdownWindow::closeEvent(QCloseEvent *event)
Expand Down
2 changes: 1 addition & 1 deletion src/qt/utilitydialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ class ShutdownWindow : public QWidget

public:
ShutdownWindow(QWidget *parent=0, Qt::WindowFlags f=0);
static void showShutdownWindow(BitcoinGUI *window);
static QWidget *showShutdownWindow(BitcoinGUI *window);

protected:
void closeEvent(QCloseEvent *event);
Expand Down

0 comments on commit 5204598

Please sign in to comment.