c++ - GtkTextBuffer 的问题,令人困惑的运行时错误。需要帮忙?

标签 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);
}

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

段错误:返回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/

相关文章:

python - 无法获取 GtkDrawingArea 小部件的 xid

gtk - 如何在 Windows 7 上编译 GTK wave viewer?

c - 在回调函数中访问 GTK 小部件的结构时如何避免段错误?

c++ - 类之间互相使用?

c - 如何将服务器绑定(bind)到不同的端口而不是单个端口?

c - 在 TCP 流中发送消息

c++ - 值(value)的生命周期

c++ - 是否有不同类型的 .lib 文件?

c++ - 如何在 C++ 中将 float 组添加到浮点 vector

c++ - 为什么空指针解引用不是异常