【发布时间】:2020-01-09 04:25:29
【问题描述】:
如果我想多次运行一个 gtk 应用程序,我的 Gtk-rs 程序会崩溃。
use gio::prelude::*;
use gtk::prelude::*;
static APP_ID: &'static str = "com.localserver.app";
fn build_ui(app: >k::Application, fallback_message: Option<&'static str>) {
{
let window = gtk::ApplicationWindow::new(app);
window.set_title("App");
window.set_position(gtk::WindowPosition::Center);
window.set_default_size(350, 70);
window.add(>k::Label::new(Some(
fallback_message.unwrap_or("Hello world"),
)));
window
}
.show_all();
}
fn main() {
let args = std::env::args().collect::<Vec<_>>();
let application: gtk::Application =
gtk::Application::new(Some(APP_ID), Default::default()).unwrap();
application.connect_activate(|app| build_ui(&app, None));
for n in 1 .. 4 {
application.run(&args);
println!("Window loaded {} times.", n);
}
}
运行时,它会在最后完成 for 循环中的第一次迭代,但下一次会崩溃:
(dbustest_rs:9805): GLib-GIO-CRITICAL **: 19:23:51.883: g_application_parse_command_line: assertion '!application->priv->options_parsed' failed
Segmentation fault (core dumped)
是什么原因造成的,我该如何预防?
【问题讨论】:
-
你的
Some(fallback_message.unwrap_or("Hello world"))可以写成:fallback_message.or(Some("Hello world")) -
这可能应该在 gtk-rs 中作为一个问题提出——你永远不能在安全的 Rust 代码中导致段错误。诚然,这条线有点模糊,因为它发生在外部库中,但仍然如此!