【问题标题】:Why does GTK button produce: "Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)"?为什么 GTK 按钮会产生:“进程以退出代码 139 完成(被信号 11 中断:SIGSEGV)”?
【发布时间】:2020-02-16 08:44:44
【问题描述】:

GUI 加载并完美运行。我试过用一个简单的 cout 替换 runBackup() ,但这也不起作用。我相信问题出在我的按钮上。

功能:

namespace fs = std::filesystem;

static GtkWidget *backupDirs;
static GtkWidget *backupTo;
static GtkWidget *backupStatus_label;

void runBackup(GtkWidget *runBackup, gpointer data) {
    std::string backup = gtk_entry_get_text(GTK_ENTRY(backupDirs));
    std::ifstream backupFile(backup);
    std::string backupLocation = gtk_entry_get_text(GTK_ENTRY(backupTo));
    std::string line;
    while (getline(backupFile, line)) {
        fs::copy(line, backupLocation, fs::copy_options::recursive);
    }
}

按钮:

runBackup = gtk_button_new_with_label("Begin Backup");
g_signal_connect(runBackup, "clicked", G_CALLBACK(runBackup), NULL);
gtk_grid_attach(GTK_GRID(grid), runBackup, 0, 4, 1, 1);

错误:

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

【问题讨论】:

  • static GtkWidget *backupDirs; static GtkWidget *backupTo; static GtkWidget *backupStatus_label; 似乎是一个非常糟糕的主意。
  • gtk_entry_get_text(GTK_ENTRY(backupDirs)) 如果我不把这些指针放在那里就不起作用。

标签: c++ user-interface segmentation-fault gtk gtk3


【解决方案1】:

如果没有看到你的整个程序很难判断,但似乎通过给你的 GtkButton 变量runBackup 与回调runBackup 同名,你可能会隐藏回调的名称?也就是说,当您将信号连接到G_CALLBACK(runBackup) 时,您是在告诉它在您的 GtkButton 数据指针的地址(非常危险)而不是在您的回调函数的地址执行信号处理程序?

您是否收到任何关于将数据指针转换为函数指针的编译器警告?

【讨论】:

    猜你喜欢
    • 2021-09-12
    • 2020-07-02
    • 2020-12-05
    • 1970-01-01
    • 2018-08-31
    • 2018-05-03
    • 2021-04-02
    • 2019-11-25
    相关资源
    最近更新 更多