c - gtk+ 在调用任何 cairo 绘图函数时崩溃

标签 c macos gtk x11

抱歉我的英语不好。

我正在按照这篇文章学习 gtk+ 3 作为“helloworld” https://developer.gnome.org/gtk3/stable/gtk-getting-started.html

我的环境:
* Mac OS X 10.8.3
* XQuartz 2.7.4
* GTk+ 3.4.4
* i686-apple-darwin11-llvm-gcc-4.2

在我尝试调用此函数作为绘图的信号处理程序之前一切正常:

static gboolean configure_event_cb(GtkWidget* widget,GdkEventConfigure* event,gpointer data)
{

    if(surface) cairo_surface_destroy(surface);

    surface = gdk_window_create_similar_surface(gtk_widget_get_window(widget),
                                                CAIRO_CONTENT_COLOR,
                                                gtk_widget_get_allocated_width(widget),
                                                gtk_widget_get_allocated_height(widget));

    //非对象类型.看做普通的struct. cairo看做类似Graphics的静态类.
    cairo_t* cr = cairo_create(surface);

    cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);

    cairo_paint(cr);

    cairo_destroy(cr);

    return TRUE;
}

程序总是在其他函数的“cairo_paint(cr)”或“cairo_fill”行崩溃。这是调用堆栈:

libcairo.2.dylib`_cairo_default_context_in_clip:
0x100a71ff5:  pushq  %rbp
0x100a71ff6:  movq   %rsp, %rbp
0x100a71ff9:  pushq  %rbx
0x100a71ffa:  pushq  %rax
0x100a71ffb:  movq   %rsi, %rbx
0x100a71ffe:  movq   40(%rdi), %rdi
0x100a72002:  callq  0x100a761c1               ; _cairo_gstate_in_clip
0x100a72007:  movl   %eax, (%rbx)
0x100a72009:  xorl   %eax, %eax
0x100a7200b:  addq   $8, %rsp
0x100a7200f:  popq   %rbx
0x100a72010:  popq   %rbp
0x100a72011:  ret    

有人能帮帮我吗?

最佳答案

我怀疑由于调用 cairo_surface_destroy 而导致内存损坏。您在哪里声明 surface?在调用 cairo_surface_destroy 之前,您在哪里设置它?您确定它指向引用计数 > 0 的有效表面对象吗?

我会尝试注释该行,看看您是否仍然遇到崩溃。那时您可能需要修复一些内存泄漏,但至少您会知道这是否是问题所在。

关于c - gtk+ 在调用任何 cairo 绘图函数时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16579563/

相关文章:

c++ - 在 Windows 下获取指向调用堆栈底部的指针并通过地址(如 dladdr)解析符号?

c - 为什么这段 C 代码会在不告诉它的情况下将我的变量 lastName 更改为另一个值?

objective-c - 如何为 Mac App 创建辅助应用程序以在用户登录时启动它?

c - 如何在 GTK+ 中启动和停止 GIF 动画 GtkImage

rust - 如何使用 gtk::DrawingArea?

c - 如何在消息到达时过滤/发送消息

c - 面向对象的C : Building vtables

swift - 如何在 CoreAudio 中从多个设备输出音频?

objective-c - 你如何比较 Swift 中的 NSFontSymbolicTraits 和 NSFontBoldTrait?

gtk - 如何使用 GTK+ 将 HTML 粘贴到剪贴板