我正在使用这段代码:
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);
}
编译正常。但是给出了这个奇怪的运行时错误:
段错误:返回139
我已将问题追溯到:gtk_text_view_get_buffer(GTK_TEXT_VIEW(_srcset[index]));
注意:我使用的是 GtkSourceView 而不是 GtkTextView,但这可能不是问题,因为我在尝试 GtkTextView 时遇到了同样的错误。
注意:我使用的是 Gtk 2x
注意:我不确定是用 C 还是 C++ 标记这个问题。因为。 Gtk+ 是一个 C 库。但我正在使用 C++。所以我现在只标记两者。
最佳答案
您的代码中的问题可能是通过 gtk_notebook_append_page
添加到 GtkNotebook
的子部件不是可见,尝试通过显示子部件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
,我认为这可能会发生在您的情况中并且作为 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);
}
希望这对您有所帮助!
关于c++ - GtkTextBuffer 的问题,令人困惑的运行时错误。需要帮忙?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7512619/