GtkTextBuffer问题,困惑运行时错误。需要帮忙?

时间:2011-09-22 09:34:33

标签: c++ c gtk runtime-error

我正在使用此代码:

class editbook
{
  GtkWidget* _nbook;
  std::vector<GtkWidget*> _srcset; //and so on...

............................................... ............................................

void editbook::add_page()
{
    GtkWidget* tmp = gtk_source_view_new();
    _srcset.push_back(tmp);
    gtk_notebook_append_page(GTK_NOTEBOOK(_nbook),tmp,gtk_label_new("untitled"));
}

............................................... ............................................

void editbook::set_text(const std::string& text)
{
    int index = gtk_notebook_get_current_page(GTK_NOTEBOOK(_nbook));
    GtkTextBuffer* tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset[index]));
    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(tbuffer),text.c_str(),-1);
}

编译好。但是给出了这个奇怪的运行时错误:

Segementation Fault:返回139

我已将问题追溯到:gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset[index]));

注意:我使用GtkSourceView而不是GtkTextView,但这可能不是问题,因为我在尝试GtkTextView时遇到了同样的错误。

注意:我使用的是Gtk 2x

注意:我不确定是用C还是C ++标记这个问题。 BEC。 Gtk +是一个C lib。但我正在使用C ++。所以我现在只标记这两个。

1 个答案:

答案 0 :(得分:1)

您的代码中的问题可能是通过GtkNotebook添加到gtk_notebook_append_page的子窗口小部件不是可见,尝试通过gtk_widget_show调用显示子窗口小部件。这些方面的东西:

void editbook::add_page()
{
    GtkWidget* tmp = gtk_source_view_new();
    _srcset.push_back(tmp);
    gtk_widget_show(tmp); //Show the child widget to make it visible
    gtk_notebook_append_page(GTK_NOTEBOOK(_nbook),tmp,gtk_label_new("untitled"));
}

当您使用gtk_notebook_get_current_page时,如果子窗口小部件都不可见,那么它会返回-1,我认为这可能会发生在您的情况下&amp;当index使用-1并且不检查边界时,operator[]vector::at,程序崩溃。我强烈建议您使用operator[]而不是std::out_of_range,以便在运行时获得void editbook::set_text(const std::string& text) { int index = gtk_notebook_get_current_page(GTK_NOTEBOOK(_nbook)); GtkTextBuffer* tbuffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset.at(index))); gtk_text_buffer_set_text(GTK_TEXT_BUFFER(tbuffer),text.c_str(),-1); } 异常以指示问题。你可以使用:

{{1}}

希望这有帮助!