抱歉我的英语不好。
我正在按照这篇文章学习 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/