diff --git a/unix/dialog.c b/unix/dialog.c
index 835ad978..fa645b3a 100644
--- a/unix/dialog.c
+++ b/unix/dialog.c
@@ -3345,9 +3345,18 @@ static void dlgparam_destroy(GtkWidget *widget, gpointer data)
             sfree(dp->selparams[i]);
         }
         sfree(dp->selparams);
+        dp->selparams = NULL;
     }
 #endif
-    sfree(dp);
+    /*
+     * Instead of freeing dp right now, defer it until we return to
+     * the GTK main loop. Then if any other last-minute GTK events
+     * happen while the rest of the widgets are being cleaned up, our
+     * handlers will still be able to try to look things up in dp.
+     * (They won't find anything - we've just emptied it - but at
+     * least they won't crash while trying.)
+     */
+    queue_toplevel_callback(sfree, dp);
 }
 
 static void messagebox_handler(dlgcontrol *ctrl, dlgparam *dp,